【文章內(nèi)容簡介】
息,例如,應(yīng)用程序圖標(biāo)、窗口的背景色、要在標(biāo)題欄中顯示的名稱、窗口過程函數(shù)的名稱等等。 下面的示例演示一個(gè)典型 WNDCLASSEX 結(jié)構(gòu)。 復(fù)制代碼 WNDCLASSEX wcex。 = sizeof(WNDCLASSEX)。 = CS_HREDRAW | CS_VREDRAW。 = WndProc。 = 0。 = 0。 = hInstance。 = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION))。 = LoadCursor(NULL, IDC_ARROW)。 = (HBRUSH)(COLOR_WINDOW+1)。 = NULL。 = szWindowClass。 = LoadIcon(, MAKEINTRESOURCE(IDI_APPLICATION))。有關(guān)此結(jié)構(gòu)的各字段的信息,請參見 WNDCLASSEX。2. 現(xiàn)在您已經(jīng)創(chuàng)建一個(gè)窗口類,接下來必須將其注冊。 使用 RegisterClassEx 函數(shù),并將窗口類結(jié)構(gòu)作為參數(shù)進(jìn)行傳遞。 復(fù)制代碼 if (!RegisterClassEx(amp。wcex)) { MessageBox(NULL, _T(Call to RegisterClassEx failed!), _T(Win32 Guided Tour), NULL)。 return 1。 }3. 現(xiàn)在可以創(chuàng)建一個(gè)窗口。 使用 CreateWindow 函數(shù)。 復(fù)制代碼 static TCHAR szWindowClass[] = _T(win32app)。static TCHAR szTitle[] = _T(Win32 Guided Tour Application)。// The parameters to CreateWindow explained:// szWindowClass: the name of the application// szTitle: the text that appears in the title bar// WS_OVERLAPPEDWINDOW: the type of window to create// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)// 500, 100: initial size (width, length)// NULL: the parent of this window// NULL: this application does not have a menu bar// hInstance: the first parameter from WinMain// NULL: not used in this applicationHWND hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL)。if (!hWnd){ MessageBox(NULL, _T(Call to CreateWindow failed!), _T(Win32 Guided Tour), NULL)。 return 1。}此函數(shù)返回 HWND,它是某個(gè)窗口的句柄。 有關(guān)更多信息,請參見 Windows 數(shù)據(jù)類型。 4. 現(xiàn)在,使用下列代碼來顯示窗口。復(fù)制代碼 // The parameters to ShowWindow explained:// hWnd: the value returned from CreateWindow// nCmdShow: the fourth parameter from WinMainShowWindow(hWnd, nCmdShow)。UpdateWindow(hWnd)。此時(shí),所顯示的窗口不會(huì)有太多內(nèi)容,因?yàn)槟形磳?shí)現(xiàn) WndProc 函數(shù)。5. 現(xiàn)在添加一個(gè)消息循環(huán)以偵聽操作系統(tǒng)發(fā)送的消息。 如果應(yīng)用程序收到一條消息,則此循環(huán)會(huì)將該消息調(diào)度至 WndProc 函數(shù)以接受處理。 消息循環(huán)類似于下列代碼。 復(fù)制代碼 MSG msg。 while (GetMessage(amp。msg, NULL, 0, 0)) { TranslateMessage(amp。msg)。 DispatchMessage(amp。msg)。 } return (int) 。有關(guān)消息循環(huán)中各結(jié)構(gòu)和函數(shù)的更多信息,請參見 MSG、GetMessage、TranslateMessage 和 DispatchMessage。此時(shí),WinMain 函數(shù)應(yīng)與下列代碼類似。復(fù)制代碼 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ WNDCLASSEX wcex。 = sizeof(WNDCLASSEX)。 = CS_HREDRAW | CS_VREDRAW。 = WndProc。 = 0。 = 0。 = hInstance。 = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION))。 = LoadCursor(NULL, IDC_ARROW)。 = (HBRUSH)(COLOR_WINDOW+1)。 = NULL。 = szWindowClass。 = LoadIcon(, MAKEINTRESOURCE(IDI_APPLICATION))。 if (!RegisterClassEx(amp。wcex)) { MessageBox(NULL, _T(Call to RegisterClassEx failed!), _T(Win32 Guided Tour), NULL)。 return 1。 } hInst = hInstance。 // Store instance handle in our global variable // The parameters to CreateWindow explained: // szWindowClass: the name of the application // szTitle: the text that appears in the title bar // WS_OVERLAPPEDWINDOW: the type of window to create // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y) // 500, 100: initial size (width, length) // NULL: the parent of this window // NULL: this application dows not have a menu bar // hInstance: the first parameter from WinMain // NULL: not used in this application HWND hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL )。 if (!hWnd) { MessageBox(NULL, _T(Call to CreateWindow failed!), _T(Win32 Guided Tour), NULL)。 return 1。 } // The parameters to ShowWindow explained: // hWnd: the value returned from CreateWindow // nCmdShow: the fourth parameter from WinMain ShowWindow(hWnd, nCmdShow)。 UpdateWindow(hWnd)。 // Main message loop: MSG msg。 while (GetMessage(amp。msg, NULL, 0, 0)) { TranslateMessage(amp。msg)。 DispatchMessage(amp。msg)。 } return (int) 。}向 WndProc 函數(shù)添加功能1. 若要啟用 WndProc 函數(shù)來處理應(yīng)用程序所收到的消息,請實(shí)現(xiàn) switch 語句。要處理的第一條消息是 WM_PAINT 消息。 如果必須更新所顯示的應(yīng)用程序窗口的一部分,該應(yīng)用程序就會(huì)收到此消息。 (首次顯示該窗口時(shí),必須將其全部更新。) 若要處理 WM_PAINT 消息,請首先調(diào)用 BeginPaint,然后處理用于布局該窗口中的文本、按鈕和其他控件的所有邏輯,再調(diào)用 EndPaint。 對于此應(yīng)用程序,開始調(diào)用和結(jié)束調(diào)用之間的邏輯會(huì)在窗口中顯示字符串“Hello, World!”。 在下列代碼中,請注意 TextOut 函數(shù)用于顯示該字符串。 復(fù)制代碼 PAINTSTRUCT ps。HDC hdc。TCHAR greeting[] = _T(Hello,