版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、盡管 Windows 應(yīng)用程序千變?nèi)f化,令人眼花繚亂,但,消息機(jī)制和窗口過程卻始終它們的基礎(chǔ),掌握了這兩項技術(shù),也就相當(dāng)于把握住了問題的關(guān)鍵。如果你以前是 C 程序員或是 MFC 的忠實用戶,只要你學(xué)習(xí)過 C 語言的語法,自己親手編過一些簡短的 C 程序,理解以下的 Win32 編程基礎(chǔ)也不是一件困難的事。一個最簡單的Win32 程序在以前的 C 語言編程中,一個最簡單的程序可以只有兩行。void main(void) printf Hello World!; 而要實現(xiàn)同樣功能的Windows程序卻最少也要寫幾十行,這并不是說明Windows應(yīng)用程序效率低下,難于掌握,只是說明程序在Windo
2、ws環(huán)境下有更豐富的內(nèi)涵。Windows程序的效率其實不低,在所有的Windows應(yīng)用程序中,都有一個程序初始化的過程,這得用上幾十條語句,這段初始化的代碼對于任何Windows應(yīng)用程序而言,都是大同小異的。下面以一個實現(xiàn)最簡單功能的程序EasyWin為例,說明Windows程序的基本框架。打開 Visual C+ 6.0。選擇 File 菜單的 New ,在出現(xiàn)的對話框中,選擇Projects欄目(新建工程),并點取其下的 Win32 Application項,表示使用Win32 環(huán)境創(chuàng)建應(yīng)用程序。先在Locatin (路徑)中填入 “c:”,然后在Project Name (項目名稱)中填
3、入“EasyWin”,其它按照缺省設(shè)置)。單擊 OK 按鈕。再次選擇 File 菜單的 New ,在出現(xiàn)的對話框中,選擇Files 欄目(新建文件),并點取其下的 C+ Source File項,表示新建一個C+ 源文件。在右邊的File 欄中輸入 “EasyWin”,最后確定讓Add to project檢查框打上勾)。單擊OK 按鈕。在 EasyWin.cpp文件中輸入以下源程序代碼。/*/ 工程: easywin/ 文件: easywin.cpp/ 內(nèi)容:一個基本的 Win32 程序 /*#include #include / 函數(shù)聲明BOOL InitWindow( HINSTANCE
4、 hInstance, int nCmdShow );LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam );/*/ 函數(shù): WinMain()/ 功能: Win32 應(yīng)用程序入口函數(shù)。創(chuàng)建主窗口,處理消息循環(huán)/*int PASCAL WinMain( HINSTANCE hInstance, /當(dāng)前實例句柄HINSTANCE hPrevInstance, /前一個實例句柄LPSTR lpCmdLine, /命令行字符int nCmdShow) /窗口顯示方式MSG msg;/ 創(chuàng)建主窗
5、口if ( !InitWindow( hInstance, nCmdShow ) )return FALSE;/ 進(jìn)入消息循環(huán):/ 從該應(yīng)用程序的消息隊列中檢取消息,送到消息處理過程,/ 當(dāng)檢取到 WM_QUIT 消息時,退出消息循環(huán)。while (GetMessage(&msg, NULL, 0, 0)TranslateMessage(&msg);DispatchMessage(&msg);/ 程序結(jié)束return msg.wParam;/*/ 函數(shù): InitWindow()/ 功能:創(chuàng)建窗口。/*static BOOL InitWindow( HINSTANCE hInstance, i
6、nt nCmdShow )HWND hwnd; /窗口句柄WNDCLASS wc; /窗口類結(jié)構(gòu)/ 填充窗口類結(jié)構(gòu)wc.style = CS_VREDRAW | CS_HREDRAW;wc.lpfnWndProc = (WNDPROC)WinProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = hInstance;wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );wc.hCursor = LoadCursor( NULL, IDC_ARROW );wc.hbrBackground = G
7、etStockObject(WHITE_BRUSH);wc.lpszMenuName = NULL;wc.lpszClassName = EasyWin;/ 注冊窗口類RegisterClass( &wc );/ 創(chuàng)建主窗口hwnd = CreateWindow(EasyWin, / 窗口類名稱 一個基本的 Win32 程序 , / 窗口標(biāo)題WS_OVERLAPPEDWINDOW, /窗口風(fēng)格,定義為普通型100, / 窗口位置的x 坐標(biāo)100, / 窗口位置的y 坐標(biāo)400, / 窗口的寬度300, / 窗口的高度NULL, / 父窗口句柄NULL, / 菜單句柄hInstance, / 應(yīng)
8、用程序?qū)嵗浔鶱ULL ); / 窗口創(chuàng)建數(shù)據(jù)指針if( !hwnd ) return FALSE;/ 顯示并更新窗口ShowWindow( hwnd, nCmdShow );UpdateWindow( hwnd );return TRUE;/*/ 函數(shù): WinProc()/ 功能:處理主窗口消息/*LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )switch( message )case WM_KEYDOWN:/擊鍵消息switch( wParam )case VK_ESCAP
9、E:MessageBox(hWnd,ESC鍵按下了 !,Keyboard,MB_OK);break;break;case WM_RBUTTONDOWN:/鼠標(biāo)消息MessageBox(hWnd,鼠標(biāo)右鍵按下了 !,Mouse,MB_OK);break;case WM_PAINT:/窗口重畫消息char hello= 你好,我是EasyWin !;HDC hdc;PAINTSTRUCT ps;hdc=BeginPaint( hWnd,&ps ); /取得設(shè)備環(huán)境句柄SetTextColor(hdc, RGB(0,0,255); /設(shè)置文字顏色TextOut( hdc, 20, 10, hello
10、, strlen(hello) );/輸出文字EndPaint( hWnd, &ps ); /釋放資源break;case WM_DESTROY:/退出消息PostQuitMessage( 0 );/調(diào)用退出函數(shù)break;/ 調(diào)用缺省消息處理過程return DefWindowProc(hWnd, message, wParam, lParam);程序輸入完畢,即可編譯執(zhí)行。在窗口中擊鼠標(biāo)鍵或按ESC鍵時,會彈出一個對話框以表示你的操作。其實,這個程序可以看成是所有 Win32 應(yīng)用程序的框架,在以后所有的程序中,你會發(fā)現(xiàn)它們都是在這個程序的基礎(chǔ)之上再添加代碼。WinMain()函數(shù)WinM
11、ain() 函數(shù)是應(yīng)用程序開始執(zhí)行時的入口點,通常也是應(yīng)用程序結(jié)束任務(wù)退出時的出口點。它與DOS 程序的 main() 函數(shù)起同樣的作用,有一點不同的是,WinMain()須帶有四個參數(shù),它們是系統(tǒng)傳遞給它的。WinMain() 函數(shù)的原型如下:函數(shù)必int PASCAL WinMain( HINSTANCE hInstance, /當(dāng)前實例句柄HINSTANCE hPrevInstance, /前一個實例句柄LPSTR lpCmdLine, /命令行字符int nCmdShow) /窗口顯示方式第一個參數(shù)HINSTANCE是hInstance ,是標(biāo)識該應(yīng)用程序當(dāng)前的實例的句柄。Handle
12、 of Instance的縮寫,表示實例的句柄。它是 HINSTANCE類型,hInstance是一個很關(guān)鍵的數(shù)據(jù),它唯一的代表該應(yīng)用程序,在后面初始化程序主窗口的過程中需要用到這個參數(shù)。這里有兩個概念,一個是實例, 一個是句柄。 實例代表的是應(yīng)用程序執(zhí)行的整個過程和方法,一個應(yīng)用程序如果沒有被執(zhí)行,只是存在于磁盤上,那么就說它是沒有被實例化的;只要一執(zhí)行,則說該程序的一個實例在運行。句柄,顧名思義,指的是一個對象的把柄。在Windows 中,有各種各樣的句柄,它們都是 32位的指針變量, 用來指向該對象所占據(jù)的內(nèi)存區(qū)。句柄的使用,可以極大的方便Windows管理其內(nèi)存中的各種對象。第二個參數(shù)
13、是hPrevInstance,它是用來標(biāo)識該應(yīng)用程序的前一個實例句柄。對于基于Win32 的應(yīng)用程序來說,這個參數(shù)總是NULL 。這是因為在 Win95 操作系統(tǒng)中,應(yīng)用程序的每個實例都有各自獨立的地址空間,即使同一個應(yīng)用程序被執(zhí)行了兩次,在內(nèi)存中也會為它們的每一個實例分配新的內(nèi)存空間,所以一個應(yīng)用程序被執(zhí)行后,不會有前一個實例存在的可能。也就是說,hPrevInstance這個參數(shù)是完全沒有必要的,只是為了提供與16位Windows 的應(yīng)用程序形式上的兼容性,才保留了這個參數(shù)。在以前的16位 Windows環(huán)境下(如 Windows3.2), hPrevInstance 用來標(biāo)識與 hIns
14、tance 相關(guān)的應(yīng)用程序的前一個句柄。第三個參數(shù)是lpCmdLine ,是指向應(yīng)用程序命令行參數(shù)字符串的指針。如在 Win95的 “開始”菜單中單擊 “運行 ”,輸入 “easywin hello ,”則此參數(shù)指向的字符串為“hello?!弊詈笠粋€參數(shù)是nCmdShow ,是一個用來指定窗口顯示方式的整數(shù)。這個整數(shù)值可以是 SW_SHOW 、SW_HIDE 、SW_SHOWMAXIMIZED 、SW_SHOWMINIMIZED 等,關(guān)于這些值的含義,將在下一節(jié)說明。注冊窗口類一個應(yīng)用程序可以有許多窗口,但只有一個是主窗口,它是與該應(yīng)用程序的實例句柄唯一關(guān)聯(lián)的。上面的例程中,創(chuàng)建主窗口的函數(shù)是
15、InitWindow() 。通常要對填充一個窗口類結(jié)構(gòu) WNDCLASS ,然后調(diào)用 RegisterClass() 對該窗口類進(jìn)行注冊。每個窗口都有一些基本的屬性,如窗口邊框、窗口標(biāo)題欄文字、窗口大小和位置、鼠標(biāo)、 背景色、 處理窗口消息函數(shù)的名稱等等。注冊的過程也就是將這些屬性告訴系統(tǒng),然后再調(diào)用 CreateWindow()函數(shù)創(chuàng)建出窗口。這也就象你去裁縫店訂做一件衣服,先要告訴店老板你的身材尺寸、布料顏色、 以及你想要的款式,然后他才能為你做出一件讓你滿意的衣服。在 VC 的幫助中,可以看到WNDCLASS結(jié)構(gòu)是這樣定義的:typedef struct _WNDCLASS UINT s
16、tyle; /窗口的風(fēng)格 *WNDPROC lpfnWndProc; /指定窗口的消息處理函數(shù)的遠(yuǎn)指針*int cbClsExtra; /指定分配給窗口類結(jié)構(gòu)之后的額外字節(jié)數(shù)*int cbWndExtra; /指定分配給窗口實例之后的額外字節(jié)數(shù)HANDLE hInstance; /指定窗口過程所對應(yīng)的實例句柄*HICON hIcon; /指定窗口的圖標(biāo)HCURSOR hCursor; /指定窗口的鼠標(biāo)HBRUSH hbrBackground; /指定窗口的背景畫刷LPCTSTR lpszMenuName; /窗口的菜單資源名稱LPCTSTR lpszClassName; /該窗口類的名稱* W
17、NDCLASS;在 Win95 和 WinNT 的具有新界面特性的系統(tǒng)中, 為了支持新的窗口界面特性, 還有一種擴(kuò)展的窗口類型 WNDCLASSEX ,它的定義如下:typedef struct _WNDCLASSEX UINT cbSize; / 指定 WNDCLASSEX結(jié)構(gòu)的大小UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HANDLE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCTSTR lpszMenuName;LPCTSTR l
18、pszClassName;HICON hIconSm; /窗口的小圖標(biāo) WNDCLASSEX;WNDCLASS 和 WNDCLASSEX 這兩個結(jié)構(gòu)基本上是一致的, 只是 WNDCLASSEX 結(jié)構(gòu)中多了 cbSize 和 hIconSm 這兩個成員。 WNDCLASS 結(jié)構(gòu)的各成員中, 其注釋后打了星號的表示該項應(yīng)特別注意。WNDCLASS 結(jié)構(gòu)的第一個成員 style 表示窗口類的風(fēng)格,它往往是由一些基本的風(fēng)格通過位的 “或 ”操作(操作符位 “)|”組合而成。下表列出了一些常用的基本窗口風(fēng)格:風(fēng)格含義CS_HREDRAW如果窗口客戶區(qū)寬度發(fā)生改變,重繪整個窗口CS_VREDRAW如果窗口
19、客戶區(qū)高度發(fā)生改變,重繪整個窗口CS_DBLCLKS能感受用戶在窗口中的雙擊消息CS_NOCLOSE禁用系統(tǒng)菜單中的“關(guān)閉 ”命令CS_OWNDC為該窗口類的各窗口分配各自獨立的設(shè)備環(huán)境CS_CLASSDC為該窗口類的各窗口分配一個共享的設(shè)備環(huán)境CS_PARENTDC指定子窗口繼承其父窗口的設(shè)備環(huán)境把被窗口遮掩的屏幕圖象部分作為位圖保存起來。當(dāng)該窗口被移動時, WindowsCS_SAVEBITS使用被保存的位圖來重建屏幕圖象在 EasyWin應(yīng)用程序中,是按如下方式對WNDCLASS結(jié)構(gòu)進(jìn)行填充和注冊的:wc.style = CS_VREDRAW | CS_HREDRAW;wc.lpfnWn
20、dProc = (WNDPROC)WinProc;wc.cbClsExtra = 0;wc.cbWndExtra = 0;wc.hInstance = hInstance;wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION );wc.hCursor = LoadCursor( NULL, IDC_ARROW );wc.hbrBackground = GetStockObject(WHITE_BRUSH);wc.lpszMenuName = NULL;wc.lpszClassName = EasyWin;可以看到, wc.style 被設(shè)為 CS_VR
21、EDRAW | CS_HREDRAW ,表示只要窗口的高度或?qū)挾劝l(fā)生變化,都會重畫整個窗口。第二個成員 lpfnWndProc 的值為 (WNDPROC)WinProc 。表明該窗口類的消息處理函數(shù)是 WinProc() 函數(shù)。這里,要指定窗口的消息處理函數(shù)的遠(yuǎn)指針,輸入消息處理函數(shù)的函數(shù)名稱即可,必要時應(yīng)該進(jìn)行強(qiáng)制類型轉(zhuǎn)換,將其轉(zhuǎn)換成WNDPROC型。接下來的 cbClsExtra和 wc.cbWndExtra在大多數(shù)情況下都會設(shè)為0。然后的 hInstance 成員,給它的值是由 WinMain() 傳來的應(yīng)用程序的實例句柄,表明該窗口與該實例是相關(guān)聯(lián)的。 事實上, 只要是注冊窗口類, 該
22、成員的值始終是該程序的實例句柄,你應(yīng)該象背書一樣記住它。下面的 hIcon ,是讓你給這個窗口指定一個圖標(biāo),調(diào)用IDI_APPLICATION ),可以調(diào)用系統(tǒng)內(nèi)部預(yù)先定義好的標(biāo)志符為LoadIcon( hInstance,IDC_APPLICATION的圖標(biāo)作為該窗口的圖標(biāo)。同樣,調(diào)用LoadCursor( NULL, IDC_ARROW )為該窗口調(diào)用系統(tǒng)內(nèi)部預(yù)先定義好的箭頭型鼠標(biāo)。hbrBackground 成員用來定義窗口的背景畫刷顏色,也就是該窗口的背景色。調(diào)用 GetStockObject(WHITE_BRUSH) 可以獲得系統(tǒng)內(nèi)部預(yù)先定義好的白色畫刷作為窗口的背景色。上面的 Lo
23、adIcon()們的用法可以參看VC、LoadCursor() 、 GetStockObject() 的幫助,這里就不多介紹了。都是Windows的API函數(shù),它lpszMenuName 口擁有菜單,就把成員的值我們給它NULL ,表示該窗口將沒有菜單。lpszMenuName成員賦值為標(biāo)志菜單資源的字符串。如果你想讓你的窗WNDCLASS結(jié)構(gòu)的最后一個成員lpszClassName是讓你給這個窗口類起一個唯一的名稱,因為 Windows 操作系統(tǒng)中有許許多多的窗口類,必須用一個獨一無二的名稱來代表它們。通常,你可以用你的程序名來命名這個窗口類的名稱。這個名稱將在創(chuàng)建窗口的CreateWind
24、ow()函數(shù)中用到。填充完畢后,對于WNDCLASS結(jié)構(gòu),調(diào)用RegisterClass()函數(shù)進(jìn)行注冊;對于WNDCLASSEX結(jié)構(gòu),調(diào)用RegisterClassEx()函數(shù)進(jìn)行注冊,它們的原型分別如下:ATOM RegisterClass( CONST WNDCLASS *lpWndClass );ATOM RegisterClassEx( CONST WNDCLASSEX *lpwcx );該函數(shù)如調(diào)用成功,則返回一個非0 值,表明系統(tǒng)中已經(jīng)注冊了一個名為EasyWin 的窗口類。如果失敗,則返回0 。創(chuàng)建窗口當(dāng)窗口類注冊完畢之后,并不會有窗口顯示出來,因為注冊的過程僅僅是為創(chuàng)建窗口所
25、做的準(zhǔn)備工作。實際創(chuàng)建一個窗口的是通過調(diào)用CreateWindow()函數(shù)完成的。窗口類中已經(jīng)預(yù)先定義了窗口的一般屬性,而 CreateWindow() 中的參數(shù)可以進(jìn)一步指定一個窗口的更具體的屬性,在 EasyWin 程序中,是如下調(diào)用 CreateWindow() 函數(shù)來創(chuàng)建窗口的:hwnd = CreateWindow(EasyWin, / 創(chuàng)建窗口所用的窗口類的名稱*一個基本的Win32 程序 , / 窗口標(biāo)題WS_OVERLAPPEDWINDOW, /窗口風(fēng)格,定義為普通型*100, / 窗口位置的x 坐標(biāo)100, / 窗口位置的y 坐標(biāo)400, / 窗口的寬度300, / 窗口的高
26、度NULL, / 父窗口句柄NULL, / 菜單句柄hInstance, / 應(yīng)用程序?qū)嵗浔?NULL ); / 一般都為 NULLCreateWindow()函數(shù)的參數(shù)的含義在上面的注釋中已有介紹,注釋后打了星號標(biāo)記的參數(shù)應(yīng)該著重注意,其它的參數(shù)都很簡單,不多做介紹,可參看VC 的幫助。第一個參數(shù)是創(chuàng)建該窗口所使用的窗口類的名稱,注意這個名稱應(yīng)與前面所注冊的窗口類的名稱一致。第三個參數(shù)為創(chuàng)建的窗口的風(fēng)格,下表列出了常用的窗口風(fēng)格:風(fēng)格含義創(chuàng)建一個層疊式窗口,有邊框、標(biāo)題欄、系統(tǒng)菜單、最大最小化按鈕,是以WS_OVERLAPPEDWINDOW下幾種風(fēng)格的集合: WS_OVERLAPPED,
27、WS_CAPTION, WS_SYSMENU,WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX創(chuàng)建一個彈出式窗口,是以下幾種風(fēng)格的集合:WS_POPUPWINDOWWS_BORDER,WS_POPUP,WS_SYSMENU。WS_CAPTION 與WS_POPUPWINDOW 風(fēng)格必須一起使用才能使窗口菜單可見WS_OVERLAPPED創(chuàng)建一個層疊式窗口,它有標(biāo)題欄和邊框,與WS_TILED 風(fēng)格一樣WS_POPUP該窗口為彈出式窗口,不能與WS_CHILD同時使用WS_BORDER窗口有單線邊框WS_CAPTION窗口有標(biāo)題欄WS_CHILD該窗口為
28、子窗口,不能與 WS_POPUP 同時使用WS_DISABLED該窗口為無效,即對用戶操作不產(chǎn)生任何反應(yīng)WS_HSCROLL窗口有水平滾動條WS_ICONIC窗口初始化為最小化WS_MAXIMIZE窗口初始化為最大化WS_MAXIMIZEBOX窗口有最大化按鈕WS_MINIMIZE與 WS_MAXIMIZE 一樣WS_MINIMIZEBOX窗口有最小化按鈕WS_SIZEBOX邊框可進(jìn)行大小控制的窗口WS_SYSMENU創(chuàng)建一個有系統(tǒng)菜單的窗口,必須與WS_CAPTION 風(fēng)格同時使用WS_THICKFRAME創(chuàng)建一個大小可控制的窗口,與WS_SIZEBOX 風(fēng)格一樣 .WS_TILED創(chuàng)建一個
29、層疊式窗口,有標(biāo)題欄WS_VISIBLE窗口為可見WS_VSCROLL窗口有垂直滾動條程序中使用了WS_OVERLAPPEDWINDOW標(biāo)志,它是創(chuàng)建一個普通窗口常用的標(biāo)志。而在 DirectX 編程中,我們常用的是WS_POPUP ,用這個標(biāo)志創(chuàng)建的窗口沒有標(biāo)題欄和系統(tǒng)菜單,如果設(shè)定窗口為最大化,客戶區(qū)可以占滿整個屏幕,以滿足DirectX 編程的需要。CreateWindow()函數(shù)后面的參數(shù)中,仍用到了該應(yīng)用程序的實例句柄hInstance 。如果窗口創(chuàng)建成功,返回值是新窗口的句柄,否則返回NULL 。顯示和更新窗口窗口創(chuàng)建后,并不會在屏幕上顯示出來,要真正把窗口顯示在屏幕上,還得使用S
30、howWindow()函數(shù),其原型如下:BOOL ShowWindow( HWND hWnd, int nCmdShow );參數(shù) hWnd 指定要顯示得窗口的句柄,nCmdShow表示窗口的顯示方式,這里指定為從 WinMain() 函數(shù)的 nCmdShow 所傳遞而來的值。由于 ShowWindow()函數(shù)的執(zhí)行優(yōu)先級不高,所以當(dāng)系統(tǒng)正忙著執(zhí)行其它的任務(wù)時,窗口不會立即顯示出來,此時,調(diào)用UpdateWindow()函數(shù)以可以立即顯示窗口。其函數(shù)原型如下:BOOL UpdateWindow( HWND hWnd );消息循環(huán)在 Win32 編程中,消息循環(huán)是相當(dāng)重要的一個概念,看似很難,但
31、是使用起來卻是非常簡單。在 WinMain() 函數(shù)中,調(diào)用 InitWindow() 函數(shù)成功的創(chuàng)建了應(yīng)用程序主窗口之后,就要啟動消息循環(huán),其代碼如下:while (GetMessage(&msg, NULL, 0, 0)TranslateMessage(&msg);DispatchMessage(&msg);Windows應(yīng)用程序可以接收以各種形式輸入的信息,這包括鍵盤、鼠標(biāo)動作、記時器產(chǎn)生的消息,也可以是其它應(yīng)用程序發(fā)來的消息等等。Windows系統(tǒng)自動監(jiān)控所有的輸入設(shè)備,并將其消息放入該應(yīng)用程序的消息隊列中。GetMessage() 函數(shù)則是用來從應(yīng)用程序的消息隊列中按照先進(jìn)先出的原則
32、將這些消息一個個的取出來,放進(jìn)一個 MSG 結(jié)構(gòu)中去。 GetMessage() 函數(shù)原型如下:BOOL GetMessage(LPMSG lpMsg, /指向一個MSG 結(jié)構(gòu)的指針,用來保存消息HWND hWnd, /指定哪個窗口的消息將被獲取UINT wMsgFilterMin, /指定獲取的主消息值的最小值UINT wMsgFilterMax /指定獲取的主消息值的最大值);GetMessage()將獲取的消息復(fù)制到一個MSG 結(jié)構(gòu)中。如果隊列中沒有任何消息,GetMessage() 函數(shù)將一直空閑直到隊列中又有消息時再返回。如果隊列中已有消息,它將取出一個后返回。 MSG 結(jié)構(gòu)包含了一
33、條 Windows 消息的完整信息,其定義如下:typedef struct tagMSG HWND hwnd; /接收消息的窗口句柄UINT message; /主消息值WPARAM wParam; /副消息值,其具體含義依賴于主消息值LPARAM lParam; /副消息值,其具體含義依賴于主消息值DWORD time; /消息被投遞的時間POINT pt; / 鼠標(biāo)的位置 MSG;該結(jié)構(gòu)中的主消息表明了消息的類型, 例如是鍵盤消息還是鼠標(biāo)消息等, 副消息的含義則依賴于主消息值, 例如: 如果主消息是鍵盤消息, 那么副消息中則存儲了是鍵盤的哪個具體鍵的信息。GetMessage()函數(shù)還可
34、以過濾消息,它的第二個參數(shù)是用來指定從哪個窗口的消息隊列中獲取消息,其它窗口的消息將被過濾掉。如果該參數(shù)為 NULL ,則 GetMessage() 從該應(yīng)用程序線程的所有窗口的消息隊列中獲取消息。第三個和第四個參數(shù)是用來過濾MSG 結(jié)構(gòu)中主消息值的,主消息值在wMsgFilterMin和 wMsgFilterMax之外的消息將被過濾掉。如果這兩個參數(shù)為0,則表示接收所有消息。當(dāng)且僅當(dāng) GetMessage() 函數(shù)在獲取到 WM_QUIT 消息后, 將返回 0 值,于是程序退出消息循環(huán)。TranslateMessage() 函數(shù)的作用是把虛擬鍵消息轉(zhuǎn)換到字符消息, 以滿足鍵盤輸入的需要。 DispatchMessage() 函數(shù)所完成的工作是把當(dāng)前的消息發(fā)送到對應(yīng)的窗口過程中去。開啟消息循環(huán)其實是很簡單的一個步驟,幾乎所有的程序都是按照EasyWin的這個方法。你完全不必去深究這些函數(shù)的作用,只是簡單的照抄就可以了。消息處理函數(shù)消息處理函數(shù)又叫窗口過程,在這個函數(shù)中,不同的消息將用switch 語句分配到不同的處理程序中去。Windows的消息處理函數(shù)都有一個確定的樣式,即這種函數(shù)的參數(shù)個數(shù)和類型以及其返回值的類型都有明確的規(guī)定。在 VC 的說明書中, 消息處理函數(shù)的原型是這樣定義的:LRESULT CALLBACK WindowProc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年研發(fā)資料共享協(xié)議3篇
- 西安信息職業(yè)大學(xué)《人際溝通》2023-2024學(xué)年第一學(xué)期期末試卷
- 溫州科技職業(yè)學(xué)院《公共政策前沿與實踐》2023-2024學(xué)年第一學(xué)期期末試卷
- 2022年度城鎮(zhèn)保障性安居工程財政資金績效評價報告
- 2024年長春市按摩醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024年長子縣婦幼保健院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 2024年鎮(zhèn)江市中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 棗莊2024年山東棗莊市立醫(yī)院第二批急需緊缺人才招聘59人歷年參考題庫(頻考版)含答案解析
- 無錫2025年江蘇無錫市教育局直屬單位選聘事業(yè)單位工作人員歷年參考題庫(頻考版)含答案解析
- 2024年重慶建設(shè)機(jī)床廠職工醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點附帶答案
- 醫(yī)院純水系統(tǒng)施工方案
- 各類骨折病人體位護(hù)理
- 肺部感染的護(hù)理查房課件
- 三基護(hù)理練習(xí)題庫(附答案)
- 臨時施工單位安全協(xié)議書
- 網(wǎng)絡(luò)評論員培訓(xùn)
- 《數(shù)字信號處理原理與實現(xiàn)(第3版)》全套教學(xué)課件
- 大型醫(yī)院多院區(qū)一體化基礎(chǔ)信息平臺建設(shè)方案
- 2024年消防月全員消防安全知識培訓(xùn)
- 2024年航空職業(yè)技能鑒定考試-航空乘務(wù)員危險品考試近5年真題集錦(頻考類試題)帶答案
- 表 6-1-12? 咽喉部檢查法評分標(biāo)準(zhǔn)
評論
0/150
提交評論