Win32 SDK基礎(四)之如何從零開始創建windows窗口的第二步

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(&amp;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(&amp;nMsg,?NULL,?0,?0))  	{  		TranslateMessage(&amp;nMsg);  		DispatchMessage(&amp;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窗口:

Win32 SDK基礎(四)之如何從零開始創建windows窗口的第二步

以上就是Win32 SDK基礎(四)之如何從零開始創建

? 版權聲明
THE END
喜歡就支持一下吧
點贊5 分享