juliusun.com
Windows窗体的创建分为4步:注册窗口类、创建窗口、显示窗口、消息循环。
注册窗口类:这一步对于初学者有点复杂。注册窗口类主要任务有:定义窗口消息处理函数、完善窗口类结构体、调用RegisterClassEx完成注册。
定义窗口消息处理函数,我们定义如下: LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_CLOSE: DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, uMsg, wParam, lParam); } return 0; }
上述代码讲解:LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)这是系统规定的窗口消息处理函数的原型,必须这样写。参数hWnd是消息所属窗口的窗口句柄。uMsg是消息类型。wParam和lParam是消息的两个附加参数,这两个附加参数我们当前代码没有用到,以后讲解。
switch用来判断消息uMsg,当消息为WM_CLOSE时,则视为用户点击窗口的关闭按钮,此时我们调用DestroyWindow销毁窗口。当消息为WM_DESTROY时,代表窗口资源将要销毁,我们此时调用PostQuitMessage函数来向程序发送WM_QUIT消息,程序退出消息循环。如果消息不是两个消息,我们交给窗口默认处理函数DefWindoweProc来处理,注意,不处理的消息一定要交给它。
完善窗口类结构体。 TCHAR strTitle[] = TEXT("惧留孙课堂"); TCHAR strWndClass[] = TEXT("testclass"); WNDCLASSEX w; w.cbClsExtra = 0; //一般为0 w.cbWndExtra = 0; //一般为0 w.cbSize = sizeof(w); //结构体大小 w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景颜色,此时设置成白色 w.hCursor = LoadCursor(NULL, IDC_ARROW); //光标句柄 w.hIcon = LoadIcon(NULL, IDI_APPLICATION); //窗口标题栏图标 w.hIconSm = w.hIcon; //窗口标题栏小图标 w.hInstance = hInstance; //实例句柄,来自WinMain中的参数 w.lpfnWndProc = WndProc; //窗口事件处理函数,注意函数名必须与我们定义的函数名一致 w.lpszClassName = strWndClass; //窗口类名,创建窗口时,要指定窗口类名,须与此一致 w.lpszMenuName = NULL; //菜单资源,设置为NULL w.style = CS_DBLCLKS; //风格,设置为接收双击消息
调用RegisterClassEx完成窗口注册,API函数RegisterClassEx成功返回非0值,失败返回0。 if (0 == RegisterClassEx(&w)) { return 1; }
创建窗口:HWND hWnd=CreateWindowEx(0, strWndClass/*窗口类名,创建前必须注册过*/, strTitle/*标题*/, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX/*风格*/, 200/*窗口相对于屏幕横座标*/, 100/*竖座标*/, 900/*宽度*/, 500/*高度*/, NULL, NULL, hInstance, NULL); if (NULL == hWnd) { return 1; }
注意,窗口座标单位是像素,屏幕左上角像素点为0,0,Y座标随着屏幕向右移而增加,X座标随着屏幕向下而增加。
显示窗口: ShowWindow(hWnd, SW_NORMAL);//显示窗口 UpdateWindow(hWnd);//更新窗口
消息循环:MSG Msg; while (GetMessage(&Msg, NULL, 0, 0))/*GetMessage收到WM_QUIT消息时返回FALSE*/ { TranslateMessage(&Msg);/*翻译消息*/ DispatchMessage(&Msg);/*分配消息*/ }
以上代码使用TCHAR类型,ANSI和UNICODE版本可相应推测。大概过程讲完了,细节问题以后再详细说明。
总结:
/*个人总结,非标准教材,仅供初学理解参考*/ 窗口效果图:
代码:
作者QQ:3304576112 交流QQ群:316930386 本教程内容由 juliusun.com 保留版权,请匆复制传播。
京ICP备15039193号-1