创建一个空白窗口的步骤
- 申明一个窗口类
- 官方说法是注册类,个人理解就是将类中的各个参数初始化,例如窗口的起始位置、窗口大小、有无菜单等。
- 使用RegisterClass api向计算机进行注册
- 使用CreateWindow api 生成一个窗口句柄
- 在UpdateWindow、ShowWindow api中使用第四步生成的窗口句柄来生成窗口
- 创建消息处理函数
- 创建窗口处理函数,即在窗口运行中,产生的各个事件的入口函数。
整体代码如下
/* *********************************************
*功能:注册窗口
*参数:hInstance包含该类的窗口过程的实例的句柄。
*返回值:是否注册成功
**********************************************/
BOOL RegisterWindows(HINSTANCE hInstance)
{
WNDCLASSEXA wcx;
//初始化参数
wcx.cbSize = sizeof(wcx);
wcx.style = CS_HREDRAW | CS_VREDRAW;//窗口大小改变,重画窗口
wcx.lpfnWndProc = MainWndProc;//重点:指定窗口消息的处理函数
wcx.lpszClassName = "MainWndClass";
wcx.cbClsExtra = 0;
wcx.cbWndExtra = 0;
wcx.lpszMenuName = NULL;
wcx.hInstance = hInstance;
wcx.hIcon = LoadIconA(NULL, IDI_APPLICATION);
wcx.hCursor = LoadCursorA((HINSTANCE)NULL, IDC_ARROW);
wcx.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);//自带的画刷
wcx.hIconSm = (HICON)LoadImageA(hInstance, MAKEINTRESOURCEA(5), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR);
//注册并检测是否成功注册
if (!RegisterClassExA(&wcx)) {
MessageBox(NULL, "注册失败", "Infor", MB_OK);
return 0;
}
}
/* *********************************************
*功能:创建窗口
*参数:hInstance包含该类的窗口过程的实例的句柄。
*返回值:创建窗口的句柄
**********************************************/
HWND CreateWindows(HINSTANCE hInstance)
{
hParentWnd = CreateWindowA("MainWndClass",
"window",
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
//检测是否成功创建句柄
if (!hParentWnd)
MessageBox(NULL, "生成失败", "Infor", MB_OK);
//生成窗口
return hParentWnd;
}
/* *********************************************
*功能:显示窗口
*参数:nCmdShow 窗口的显示方式,最大化、最小化那种
**********************************************/
void displaywindows(int nCmdShow)
{
nCmdShow = SW_SHOWDEFAULT;
UpdateWindow(hParentWnd);
ShowWindow(hParentWnd, nCmdShow);
}
/* *********************************************
*功能:消息函数,不断的通过GetMessage捕捉着窗口的消息,
再通过TranslateMessage将虚拟键消息转换为字符消息,
然后通过DispatchMessage将消息分派给我们的窗口程序进行处理
(所谓处理就是调用我们定义的窗口处理函数WinProc)
**********************************************/
void Message()
{
MSG msg;
while (GetMessageA(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
RegisterWindows(hInstance);
CreateWindows(hInstance);
displaywindows(nCmdShow);
CreateATreeView(hParentWnd);
Message();
return 0;
}
窗口处理函数:
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg)
{
case WM_DESTROY://窗口关闭事件
PostQuitMessage(0);
return 0;
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
break;
}
}