3.5 顯示窗口。
? ? ? ? 創建了窗口之后,如果要想運行時能夠看見窗口,我們還需要顯式的設置顯示窗口:
ShowWindow(hWnd,?SW_SHOW); UpdateWindow(hWnd);
? ? ? ? ShowWindow和UpdateWindow都是系統的API,前者是設置窗口的顯示API。后者重新API窗口屬性,只有更新之后,屬性才會生效。經過了上述步驟,我們的WinAPIAPI已經變成了如下:
int?APIENTRY?wWinMain(_In_?HINSTANCE?hInstance, _In_opt_?HINSTANCE?hPrevInstance, _In_?LPWSTR????lpCmdLine, _In_?int???????nCmdShow) { ????//注冊窗口類 ????WNDCLASSEX?wce?=?{?0?}; ????wce.cbSize?=?sizeof(wce); ????wce.cbClsExtra?=?0; ????wce.cbWndExtra?=?0; ????wce.hbrBackground?=?(HBRUSH)(COLOR_WINDOW?+?1); ????wce.hCursor?=?NULL; ????wce.hIcon?=?NULL; ????wce.hIconSm?=?NULL; ????wce.hInstance?=?hInstance; ????wce.lpfnWndProc?=?wndProc; ????wce.lpszClassName?=?“Main”; ????wce.lpszMenuName?=?NULL; ????wce.style?=?CS_HREDRAW?|?CS_VREDRAW; ????ATOM?nAtom?=?RegisterClassEx(&wce); ????if?(!nAtom?) ????{ ????????MessageBox(NULL,?"注冊失敗",?"Infor",?MB_OK); ????????return?0; ????} ???? ????//創建窗口? ????HWND?hWnd?=?CreateWindowEx(0,?“Main”,?“Window”,?WS_OVERLAPPEDWINDOW,?CW_USEDEFAULT,?CW_USEDEFAULT,?CW_USEDEFAULT,?CW_USEDEFAULT,?NULL,?NULL,?g_hInstance,?NULL); ????//顯示窗口? ???ShowWindow(hWnd,?SW_SHOW);? ???UpdateWindow(hWnd);? }
3.6 開啟消息API
? ? ? ?所謂的消息循環,其實就是一個死循環,不斷的通過GetMessage捕捉著窗口的消息,再通過TranslateMessage將虛擬鍵消息轉換為字符消息,然后通過DispatchMessage將消息分派給我們的窗口程序進行處理(所謂處理就是調用我們定義的窗口處理函數WinProc):
void?Message() { ????MSG?nMsg?=?{?0?}; ????while?(GetMessage(&nMsg,?NULL,?0,?0)) ????{ ????????TranslateMessage(&nMsg); ????????DispatchMessage(&nMsg); ????} }
? ? ? ? 完成了消息循環之后,我們最終的代碼如下(這里面對窗口注冊的程序進行了封裝,但是過程是一致的):
#include<windows.h> HINSTANCE?g_hInstance?=?0; //窗口處理函數 LRESULT?CALLBACK?WndProc(HWND?hWnd,?UINT?uMsg,?WPARAM?wParam,?LPARAM?lParam) { switch?(uMsg) { case?WM_DESTROY: PostQuitMessage(0);//可以使GetMessage返回0 break; default: break; } return?DefWindowProc(hWnd,?uMsg,?wParam,?lParam); } //注冊窗口類 BOOL?Register(LPSTR?lpClassName,?WNDPROC?wndProc) { WNDCLASSEX?wce?=?{?0?}; wce.cbSize?=?sizeof(wce); wce.cbClsExtra?=?0; wce.cbWndExtra?=?0; wce.hbrBackground?=?(HBRUSH)(COLOR_WINDOW?+?1); wce.hCursor?=?NULL; wce.hIcon?=?NULL; wce.hIconSm?=?NULL; wce.hInstance?=?g_hInstance; wce.lpfnWndProc?=?wndProc; wce.lpszClassName?=?lpClassName; wce.lpszMenuName?=?NULL; wce.style?=?CS_HREDRAW?|?CS_VREDRAW; ATOM?nAtom?=?RegisterClassEx(&wce); if?(nAtom?==?0) return?FALSE; return?true; } //創建主窗口 HWND?CreateMain(LPSTR?lpClassName,?LPSTR?lpWndName) { HWND?hWnd?=?CreateWindowEx(0,?lpClassName,?lpWndName, WS_OVERLAPPEDWINDOW,?CW_USEDEFAULT,?CW_USEDEFAULT,?CW_USEDEFAULT,?CW_USEDEFAULT,?NULL,?NULL,?g_hInstance,?NULL); return?hWnd; } //顯示窗口 void?Display(HWND?hWnd) { ShowWindow(hWnd,?SW_SHOW); UpdateWindow(hWnd); } //消息循環 void?Message() { MSG?nMsg?=?{?0?}; while?(GetMessage(&nMsg,?NULL,?0,?0)) { TranslateMessage(&nMsg); DispatchMessage(&nMsg); } } int?APIENTRY?wWinMain(_In_?HINSTANCE?hInstance, _In_opt_?HINSTANCE?hPrevInstance, _In_?LPWSTR????lpCmdLine, _In_?int???????nCmdShow) { //?TODO:?Place?code?here. g_hInstance?=?hInstance; BOOL?nRet?=?Register("Main",?WndProc); if?(!nRet) { MessageBox(NULL,?"注冊失敗",?"Infor",?MB_OK); return?0; } HWND?hWnd?=?CreateMain("Main",?"window"); Display(hWnd); Message(); return?0; }</windows.h>
? ? 就此我們完成了窗口處理的整個過程,運行程序,成功創建并顯示的一個Windows窗口:
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦