Win32編程基礎(chǔ)知識(shí)

上傳人:燈火****19 文檔編號(hào):21651256 上傳時(shí)間:2021-05-06 格式:DOCX 頁數(shù):18 大?。?1.92KB
收藏 版權(quán)申訴 舉報(bào) 下載
Win32編程基礎(chǔ)知識(shí)_第1頁
第1頁 / 共18頁
Win32編程基礎(chǔ)知識(shí)_第2頁
第2頁 / 共18頁
Win32編程基礎(chǔ)知識(shí)_第3頁
第3頁 / 共18頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《Win32編程基礎(chǔ)知識(shí)》由會(huì)員分享,可在線閱讀,更多相關(guān)《Win32編程基礎(chǔ)知識(shí)(18頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、 盡管 Windows 應(yīng)用程序千變?nèi)f化,令人眼花繚亂,但,消息機(jī)制和窗口過程卻始終它們的基礎(chǔ),掌握了這兩項(xiàng)技術(shù),也就相當(dāng)于把握住了問題的關(guān)鍵。 如果你以前是 C 程序員或是 MFC 的忠實(shí)用戶,只要你學(xué)習(xí)過 C 語言的語法,自己親手編過一些簡(jiǎn)短的 C 程序,理解以下的 Win32 編程基礎(chǔ)也不是一件困難的事。 一個(gè)最簡(jiǎn)單的 Win32 程序 在以前的 C 語言編程中,一個(gè)最簡(jiǎn)單的程序可以只有兩行。 void main(void) { printf "Hello World!"; } 而要實(shí)現(xiàn)同樣功能

2、的 Windows 程序卻最少也要寫幾十行,這并不是說明 Windows 應(yīng) 用程序效率低下,難于掌握,只是說明程序在 Windows 環(huán)境下有更豐富的內(nèi)涵。 Windows 程序的效率其實(shí)不低,在所有的 Windows 應(yīng)用程序中,都有一個(gè)程序初始化的過程,這得 用上幾十條語句,這段初始化的代碼對(duì)于任何 Windows 應(yīng)用程序而言,都是大同小異的。 下面以一個(gè)實(shí)現(xiàn)最簡(jiǎn)單功能的程序 EasyWin 為例,說明 Windows 程序的基本框架。 打開 Visual C++ 6.0 。 選擇 File 菜單的 New ,在出現(xiàn)的對(duì)話框中,選擇

3、 Projects 欄目(新建工程),并點(diǎn)取 其下的 Win32 Application 項(xiàng),表示使用 Win32 環(huán)境創(chuàng)建應(yīng)用程序。先在 Locatin (路徑) 中填入 “c:”,然后在 Project Name (項(xiàng)目名稱)中填入 “EasyWin”,其它按照缺省設(shè)置)。 單擊 OK 按鈕。 再次選擇 File 菜單的 New ,在出現(xiàn)的對(duì)話框中,選擇 Files 欄目(新建文件),并點(diǎn)取 其下的 C++ Source File 項(xiàng),表示新建一個(gè) C++ 源文件。在右邊的 File 欄中輸入 “EasyWin”, 最后確定讓 Add t

4、o project 檢查框打上勾 )。單擊 OK 按鈕。 在 EasyWin.cpp 文件中輸入以下源程序代碼。 //******************************************************************* // 工程: easywin // 文件: easywin.cpp // 內(nèi)容:一個(gè)基本的 Win32 程序 //******************************************************************* #inclu

5、de #include // 函數(shù)聲明 BOOL InitWindow( HINSTANCE hInstance, int nCmdShow ); LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ); //*******************************************************************

6、 // 函數(shù): WinMain() // 功能: Win32 應(yīng)用程序入口函數(shù)。創(chuàng)建主窗口,處理消息循環(huán) //******************************************************************* int PASCAL WinMain( HINSTANCE hInstance, // 當(dāng)前實(shí)例句柄 HINSTANCE hPrevInstance, // 前一個(gè)實(shí)例句柄 LPSTR lpCmdLine, // 命令行字符 int nCmdShow) //

7、窗口顯示方式 { MSG msg; // 創(chuàng)建主窗口 if ( !InitWindow( hInstance, nCmdShow ) ) return FALSE; // 進(jìn)入消息循環(huán): // 從該應(yīng)用程序的消息隊(duì)列中檢取消息,送到消息處理過程, // 當(dāng)檢取到 WM_QUIT 消息時(shí),退出消息循環(huán)。 while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg);

8、 DispatchMessage(&msg); } // 程序結(jié)束 return msg.wParam; } //****************************************************************** // 函數(shù): InitWindow() // 功能:創(chuàng)建窗口。 //******************************************************************

9、static BOOL InitWindow( HINSTANCE hInstance, int 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 =

10、 hInstance; wc.hIcon = LoadIcon( hInstance, IDI_APPLICATION ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "EasyWin"; // 注冊(cè)窗口類 RegisterClass( &wc );

11、 // 創(chuàng)建主窗口 hwnd = CreateWindow( "EasyWin", // 窗口類名稱 " 一個(gè)基本的 Win32 程序 ", // 窗口標(biāo)題 WS_OVERLAPPEDWINDOW, // 窗口風(fēng)格,定義為普通型 100, // 窗口位置的 x 坐標(biāo) 100, // 窗口位置的 y 坐標(biāo) 400, // 窗口的寬度 300, // 窗口的高度 NULL, // 父窗口句柄 NULL, // 菜單句柄

12、 hInstance, // 應(yīng)用程序?qū)嵗浔? NULL ); // 窗口創(chuàng)建數(shù)據(jù)指針 if( !hwnd ) return FALSE; // 顯示并更新窗口 ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); return TRUE; } //****************************************************************** // 函

13、數(shù): WinProc() // 功能:處理主窗口消息 //****************************************************************** LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) { switch( message ) { case WM_KEYDOWN:// 擊鍵消息 switch( wParam )

14、 { case VK_ESCAPE: MessageBox(hWnd,"ESC 鍵按下了 !","Keyboard",MB_OK); break; } break; case WM_RBUTTONDOWN:// 鼠標(biāo)消息 { MessageBox(hWnd," 鼠標(biāo)右鍵按下了 !","Mouse",MB_OK); break; } case WM_PAINT:// 窗口重畫消息 { ch

15、ar 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, strlen(hello) );// 輸出文字 EndPaint( hWnd, &ps ); // 釋放資源 break; } case

16、 WM_DESTROY:// 退出消息 PostQuitMessage( 0 );// 調(diào)用退出函數(shù) break; } // 調(diào)用缺省消息處理過程 return DefWindowProc(hWnd, message, wParam, lParam); } 程序輸入完畢,即可編譯執(zhí)行。在窗口中擊鼠標(biāo)鍵或按  ESC  鍵時(shí),會(huì)彈出一個(gè)對(duì)話框 以表示你的操作。 其實(shí),這個(gè)程序可以看成是所有 Win32 應(yīng)用程序的框架,在以后所有的程

17、序中,你會(huì)發(fā)現(xiàn)它們都是在這個(gè)程序的基礎(chǔ)之上再添加代碼。 WinMain()  函數(shù) WinMain() 函數(shù)是應(yīng)用程序開始執(zhí)行時(shí)的入口點(diǎn),通常也是應(yīng)用程序結(jié)束任務(wù)退出時(shí)的 出口點(diǎn)。它與 DOS 程序的 main() 函數(shù)起同樣的作用,有一點(diǎn)不同的是, WinMain() 須帶有四個(gè)參數(shù),它們是系統(tǒng)傳遞給它的。 WinMain() 函數(shù)的原型如下:  函數(shù)必 int PASCAL WinMain( HINSTANCE hInstance, // 當(dāng)前實(shí)例句柄 HINSTA

18、NCE hPrevInstance, // 前一個(gè)實(shí)例句柄 LPSTR lpCmdLine, // 命令行字符 int nCmdShow) // 窗口顯示方式 第一個(gè)參數(shù) HINSTANCE 是  hInstance ,是標(biāo)識(shí)該應(yīng)用程序當(dāng)前的實(shí)例的句柄。 Handle of Instance 的縮寫,表示實(shí)例的句柄。  它是 HINSTANCE 類型, hInstance 是一個(gè)很關(guān)鍵的 數(shù)據(jù),它唯一的代表該應(yīng)用程序,在后面初始化程序主窗口的過程中需要用到這個(gè)參數(shù)。 這里

19、有兩個(gè)概念, 一個(gè)是實(shí)例, 一個(gè)是句柄。 實(shí)例代表的是應(yīng)用程序執(zhí)行的整個(gè)過程和 方法,一個(gè)應(yīng)用程序如果沒有被執(zhí)行,只是存在于磁盤上,那么就說它是沒有被實(shí)例化的; 只要一執(zhí)行,則說該程序的一個(gè)實(shí)例在運(yùn)行。句柄,顧名思義,指的是一個(gè)對(duì)象的把柄。在 Windows 中,有各種各樣的句柄, 它們都是 32 位的指針變量, 用來指向該對(duì)象所占據(jù)的內(nèi) 存區(qū)。句柄的使用,可以極大的方便 Windows 管理其內(nèi)存中的各種對(duì)象。 第二個(gè)參數(shù)是 hPrevInstance ,它是用來標(biāo)識(shí)該應(yīng)用程序的前一個(gè)實(shí)例句柄。對(duì)于基于 Win32 的應(yīng)用程序來說,

20、這個(gè)參數(shù)總是 NULL 。這是因?yàn)樵? Win95 操作系統(tǒng)中,應(yīng)用程序 的每個(gè)實(shí)例都有各自獨(dú)立的地址空間, 即使同一個(gè)應(yīng)用程序被執(zhí)行了兩次, 在內(nèi)存中也會(huì)為 它們的每一個(gè)實(shí)例分配新的內(nèi)存空間, 所以一個(gè)應(yīng)用程序被執(zhí)行后, 不會(huì)有前一個(gè)實(shí)例存在 的可能。也就是說, hPrevInstance 這個(gè)參數(shù)是完全沒有必要的,只是為了提供與16 位 Windows 的應(yīng)用程序形式上的兼容性,才保留了這個(gè)參數(shù)。在以前的 16 位 Windows 環(huán)境 下(如 Windows3.2 ), hPrevInstance 用來標(biāo)識(shí)與 hInstance 相關(guān)的應(yīng)用程序

21、的前一個(gè)句 柄。 第三個(gè)參數(shù)是 lpCmdLine ,是指向應(yīng)用程序命令行參數(shù)字符串的指針。 如在 Win95 的 “開 始”菜單中單擊 “運(yùn)行 ”,輸入 “easywin hello ,”則此參數(shù)指向的字符串為 “hello。” 最后一個(gè)參數(shù)是 nCmdShow ,是一個(gè)用來指定窗口顯示方式的整數(shù)。這個(gè)整數(shù)值可以 是 SW_SHOW 、SW_HIDE 、SW_SHOWMAXIMIZED 、SW_SHOWMINIMIZED 等,關(guān)于這些值的含義,將在下一節(jié)說明。 注冊(cè)窗口類 一個(gè)應(yīng)用程序可以有許

22、多窗口, 但只有一個(gè)是主窗口, 它是與該應(yīng)用程序的實(shí)例句柄唯 一關(guān)聯(lián)的。上面的例程中,創(chuàng)建主窗口的函數(shù)是 InitWindow() 。 通常要對(duì)填充一個(gè)窗口類結(jié)構(gòu) WNDCLASS ,然后調(diào)用 RegisterClass() 對(duì)該窗口類進(jìn)行注冊(cè)。每個(gè)窗口都有一些基本的屬性,如窗口邊框、窗口標(biāo)題欄文字、窗口大小和位置、 鼠標(biāo)、 背景色、 處理窗口消息函數(shù)的名稱等等。注冊(cè)的過程也就是將這些屬性告訴系統(tǒng),然 后再調(diào)用 CreateWindow() 函數(shù)創(chuàng)建出窗口。這也就象你去裁縫店訂做一件衣服,先要告訴 店老板你的身材尺寸、 布料顏色、

23、以及你想要的款式, 然后他才能為你做出一件讓你滿意的 衣服。 在 VC 的幫助中,可以看到 WNDCLASS 結(jié)構(gòu)是這樣定義的: typedef struct _WNDCLASS { UINT style; // 窗口的風(fēng)格 * WNDPROC lpfnWndProc; // 指定窗口的消息處理函數(shù)的遠(yuǎn)指針 * int cbClsExtra; // 指定分配給窗口類結(jié)構(gòu)之后的額外字節(jié)數(shù) * int cbWndExtra; // 指定分配給窗口實(shí)例之后的額外字節(jié)數(shù) HANDLE hInstance;

24、// 指定窗口過程所對(duì)應(yīng)的實(shí)例句柄 * HICON hIcon; // 指定窗口的圖標(biāo) HCURSOR hCursor; // 指定窗口的鼠標(biāo) HBRUSH hbrBackground; // 指定窗口的背景畫刷 LPCTSTR lpszMenuName; // 窗口的菜單資源名稱 LPCTSTR lpszClassName; // 該窗口類的名稱 * } WNDCLASS; 在 Win95 和 WinNT 的具有新界面特性的系統(tǒng)中, 為了支持新的窗口界面特性, 還有一種擴(kuò)展的窗口類型 WNDCL

25、ASSEX ,它的定義如下: 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;

26、 LPCTSTR lpszMenuName; LPCTSTR lpszClassName; HICON hIconSm; // 窗口的小圖標(biāo) } WNDCLASSEX; WNDCLASS 和 WNDCLASSEX 這兩個(gè)結(jié)構(gòu)基本上是一致的, 只是 WNDCLASSEX 結(jié)構(gòu)中多了 cbSize 和 hIconSm 這兩個(gè)成員。 WNDCLASS 結(jié)構(gòu)的各成員中, 其注釋后打了星號(hào)的表示該項(xiàng)應(yīng)特別注意。 WNDCLASS 結(jié)構(gòu)的第一個(gè)成員 style 表示窗口類的風(fēng)格,它往往是由一些基本的風(fēng)格通過位的 “或 ”操作(操作符位

27、“)|”組合而成。下表列出了一些常用的基本窗口風(fēng)格: 風(fēng)格 含義 CS_HREDRAW 如果窗口客戶區(qū)寬度發(fā)生改變,重繪整個(gè)窗口 CS_VREDRAW 如果窗口客戶區(qū)高度發(fā)生改變,重繪整個(gè)窗口 CS_DBLCLKS 能感受用戶在窗口中的雙擊消息 CS_NOCLOSE 禁用系統(tǒng)菜單中的 “關(guān)閉 ”命令 CS_OWNDC 為該窗口類的各窗口分配各自獨(dú)立的設(shè)備環(huán)境 CS_CLASSDC 為該窗口類的各窗口分配一個(gè)共享的設(shè)備環(huán)境 CS_PARENTDC 指定子窗口繼承其父窗口的設(shè)備環(huán)境 把被窗口遮掩的屏幕圖象部分作為位圖保存起來。 當(dāng)該窗口被移動(dòng)時(shí)

28、, Windows CS_SAVEBITS 使用被保存的位圖來重建屏幕圖象 在 EasyWin 應(yīng)用程序中,是按如下方式對(duì) WNDCLASS 結(jié)構(gòu)進(jìn)行填充和注冊(cè)的: wc.style = CS_VREDRAW | CS_HREDRAW; wc.lpfnWndProc = (WNDPROC)WinProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( hInstanc

29、e, IDI_APPLICATION ); wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hbrBackground = GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "EasyWin"; 可以看到, wc.style 被設(shè)為 CS_VREDRAW | CS_HREDRAW ,表示只要窗口的高度或?qū)挾劝l(fā)生變化,都會(huì)重畫整個(gè)窗口。 第二個(gè)成員 lpfnWndProc 的

30、值為 (WNDPROC)WinProc 。表明該窗口類的消息處理函數(shù)是 WinProc() 函數(shù)。這里,要指定窗口的消息處理函數(shù)的遠(yuǎn)指針,輸入消息處理函數(shù)的函數(shù) 名稱即可,必要時(shí)應(yīng)該進(jìn)行強(qiáng)制類型轉(zhuǎn)換,將其轉(zhuǎn)換成 WNDPROC 型。 接下來的 cbClsExtra 和 wc.cbWndExtra 在大多數(shù)情況下都會(huì)設(shè)為 0。 然后的 hInstance 成員,給它的值是由 WinMain() 傳來的應(yīng)用程序的實(shí)例句柄,表明該窗口與該實(shí)例是相關(guān)聯(lián)的。 事實(shí)上, 只要是注冊(cè)窗口類, 該成員的值始終是該程序的實(shí)例句柄,你應(yīng)該象背書一樣記住它。 下

31、面的 hIcon ,是讓你給這個(gè)窗口指定一個(gè)圖標(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)用 G

32、etStockObject(WHITE_BRUSH) 可以獲得系統(tǒng)內(nèi)部預(yù)先定義好的白色畫刷作為窗口的背 景色。 上面的 LoadIcon() 們的用法可以參看 VC  、LoadCursor() 、 GetStockObject() 的幫助,這里就不多介紹了。  都是  Windows  的  API  函數(shù),它 lpszMenuName 口擁有菜單,就把  成員的值我們給它 NULL ,表示該窗口將沒有菜單。 lpszMenuName

33、 成員賦值為標(biāo)志菜單資源的字符串。  如果你想讓你的窗 WNDCLASS 結(jié)構(gòu)的最后一個(gè)成員 lpszClassName 是讓你給這個(gè)窗口類起一個(gè)唯一的 名稱,因?yàn)?Windows 操作系統(tǒng)中有許許多多的窗口類,必須用一個(gè)獨(dú)一無二的名稱來代表它們。通常,你可以用你的程序名來命名這個(gè)窗口類的名稱。這個(gè)名稱將在創(chuàng)建窗口的 CreateWindow() 函數(shù)中用到。 填充完畢后,對(duì)于 WNDCLASS 結(jié)構(gòu),調(diào)用 RegisterClass() 函數(shù)進(jìn)行注冊(cè);對(duì)于 WNDCLASSEX 結(jié)構(gòu),調(diào)用 RegisterClassEx()

34、 函數(shù)進(jìn)行注冊(cè),它們的原型分別如下: ATOM RegisterClass( CONST WNDCLASS *lpWndClass ); ATOM RegisterClassEx( CONST WNDCLASSEX *lpwcx ); 該函數(shù)如調(diào)用成功,則返回一個(gè)非 0 值,表明系統(tǒng)中已經(jīng)注冊(cè)了一個(gè)名為 EasyWin 的 窗口類。如果失敗,則返回 0 。 創(chuàng)建窗口 當(dāng)窗口類注冊(cè)完畢之后, 并不會(huì)有窗口顯示出來, 因?yàn)樽?cè)的過程僅僅是為創(chuàng)建窗口所 做的準(zhǔn)備工作。實(shí)際創(chuàng)建一個(gè)窗口的是通過調(diào)用 CreateWind

35、ow() 函數(shù)完成的。窗口類中已 經(jīng)預(yù)先定義了窗口的一般屬性,而 CreateWindow() 中的參數(shù)可以進(jìn)一步指定一個(gè)窗口的更具體的屬性,在 EasyWin 程序中,是如下調(diào)用 CreateWindow() 函數(shù)來創(chuàng)建窗口的: hwnd = CreateWindow( "EasyWin", // 創(chuàng)建窗口所用的窗口類的名稱 * "一個(gè)基本的 Win32 程序 ", // 窗口標(biāo)題 WS_OVERLAPPEDWINDOW, // 窗口風(fēng)格,定義為普通型 * 100, // 窗口位置的 x 坐標(biāo) 100, //

36、 窗口位置的 y 坐標(biāo) 400, // 窗口的寬度 300, // 窗口的高度 NULL, // 父窗口句柄 NULL, // 菜單句柄 hInstance, // 應(yīng)用程序?qū)嵗浔?* NULL ); // 一般都為 NULL CreateWindow() 函數(shù)的參數(shù)的含義在上面的注釋中已有介紹,注釋后打了星號(hào)標(biāo)記的 參數(shù)應(yīng)該著重注意,其它的參數(shù)都很簡(jiǎn)單,不多做介紹,可參看 VC 的幫助。 第一個(gè)參數(shù)是創(chuàng)建該窗口所使用的窗口類的名稱, 注意這個(gè)名稱應(yīng)

37、與前面所注冊(cè)的窗口 類的名稱一致。 第三個(gè)參數(shù)為創(chuàng)建的窗口的風(fēng)格,下表列出了常用的窗口風(fēng)格: 風(fēng)格 含義 創(chuàng)建一個(gè)層疊式窗口,有邊框、標(biāo)題欄、系統(tǒng)菜單、最大最小化按鈕,是以 WS_OVERLAPPEDWINDOW 下幾種風(fēng)格的集合: WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, WS_MAXIMIZEBOX 創(chuàng)建一個(gè)彈出式窗口,是以下幾種風(fēng)格的集合: WS_POPUPWINDOW WS_BORDER,WS_POPUP,WS_SYSMENU 。WS

38、_CAPTION 與 WS_POPUPWINDOW 風(fēng)格必須一起使用才能使窗口菜單可見 WS_OVERLAPPED 創(chuàng)建一個(gè)層疊式窗口,它有標(biāo)題欄和邊框,與 WS_TILED 風(fēng)格一樣 WS_POPUP 該窗口為彈出式窗口,不能與 WS_CHILD 同時(shí)使用 WS_BORDER 窗口有單線邊框 WS_CAPTION 窗口有標(biāo)題欄 WS_CHILD 該窗口為子窗口,不能與 WS_POPUP 同時(shí)使用 WS_DISABLED 該窗口為無效,即對(duì)用戶操作不產(chǎn)生任何反應(yīng) WS_HSCROLL 窗口有水平滾動(dòng)條

39、 WS_ICONIC 窗口初始化為最小化 WS_MAXIMIZE 窗口初始化為最大化 WS_MAXIMIZEBOX 窗口有最大化按鈕 WS_MINIMIZE 與 WS_MAXIMIZE 一樣 WS_MINIMIZEBOX 窗口有最小化按鈕 WS_SIZEBOX 邊框可進(jìn)行大小控制的窗口 WS_SYSMENU 創(chuàng)建一個(gè)有系統(tǒng)菜單的窗口,必須與 WS_CAPTION 風(fēng)格同時(shí)使用 WS_THICKFRAME 創(chuàng)建一個(gè)大小可控制的窗口,與 WS_SIZEBOX 風(fēng)格一樣 . WS_

40、TILED 創(chuàng)建一個(gè)層疊式窗口,有標(biāo)題欄 WS_VISIBLE 窗口為可見 WS_VSCROLL 窗口有垂直滾動(dòng)條 程序中使用了 WS_OVERLAPPEDWINDOW 標(biāo)志,它是創(chuàng)建一個(gè)普通窗口常用的標(biāo) 志。而在 DirectX 編程中,我們常用的是 WS_POPUP ,用這個(gè)標(biāo)志創(chuàng)建的窗口沒有標(biāo)題欄 和系統(tǒng)菜單,如果設(shè)定窗口為最大化,客戶區(qū)可以占滿整個(gè)屏幕,以滿足 DirectX 編程的需 要。 CreateWindow() 函數(shù)后面的參數(shù)中,仍用到了該應(yīng)用程序的實(shí)例句柄 hInst

41、ance 。 如果窗口創(chuàng)建成功,返回值是新窗口的句柄,否則返回 NULL 。 顯示和更新窗口 窗口創(chuàng)建后,并不會(huì)在屏幕上顯示出來,要真正把窗口顯示在屏幕上,還得使用 ShowWindow() 函數(shù),其原型如下: BOOL ShowWindow( HWND hWnd, int nCmdShow ); 參數(shù) hWnd 指定要顯示得窗口的句柄, nCmdShow 表示窗口的顯示方式,這里指定為 從 WinMain() 函數(shù)的 nCmdShow 所傳遞而來的值。 由于 ShowWin

42、dow() 函數(shù)的執(zhí)行優(yōu)先級(jí)不高, 所以當(dāng)系統(tǒng)正忙著執(zhí)行其它的任務(wù)時(shí), 窗 口不會(huì)立即顯示出來,此時(shí),調(diào)用 UpdateWindow() 函數(shù)以可以立即顯示窗口。其函數(shù)原型 如下: BOOL UpdateWindow( HWND hWnd ); 消息循環(huán) 在 Win32 編程中,消息循環(huán)是相當(dāng)重要的一個(gè)概念,看似很難,但是使用起來卻是非 常簡(jiǎn)單。在 WinMain() 函數(shù)中,調(diào)用 InitWindow() 函數(shù)成功的創(chuàng)建了應(yīng)用程序主窗口之后,就要啟動(dòng)消息循環(huán),其代碼如下: while (GetMessage(&msg, NULL,

43、0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } Windows 應(yīng)用程序可以接收以各種形式輸入的信息,這包括鍵盤、鼠標(biāo)動(dòng)作 、記時(shí)器 產(chǎn)生的消息,也可以是其它應(yīng)用程序發(fā)來的消息等等。 Windows 系統(tǒng)自動(dòng)監(jiān)控所有的輸入 設(shè)備,并將其消息放入該應(yīng)用程序的消息隊(duì)列中。 GetMessage() 函數(shù)則是用來從應(yīng)用程序的消息隊(duì)列中按照先進(jìn)先出的原則將這些消息一個(gè)個(gè)的取出來,放進(jìn)一個(gè) MSG 結(jié)構(gòu)中去。 GetMessage() 函數(shù)原

44、型如下: BOOL GetMessage( LPMSG lpMsg, // 指向一個(gè) MSG 結(jié)構(gòu)的指針,用來保存消息 HWND hWnd, // 指定哪個(gè)窗口的消息將被獲取 UINT wMsgFilterMin, // 指定獲取的主消息值的最小值 UINT wMsgFilterMax // 指定獲取的主消息值的最大值 ); GetMessage() 將獲取的消息復(fù)制到一個(gè) MSG 結(jié)構(gòu)中。如果隊(duì)列中沒有任何消息, GetMessage() 函數(shù)將一直空閑直到隊(duì)列中又有消息時(shí)

45、再返回。如果隊(duì)列中已有消息,它將取出一個(gè)后返回。 MSG 結(jié)構(gòu)包含了一條 Windows 消息的完整信息,其定義如下: typedef struct tagMSG { HWND hwnd; // 接收消息的窗口句柄 UINT message; // 主消息值 WPARAM wParam; // 副消息值,其具體含義依賴于主消息值 LPARAM lParam; // 副消息值,其具體含義依賴于主消息值 DWORD time; // 消息被投遞的時(shí)間 POINT pt; // 鼠標(biāo)的位置 } M

46、SG; 該結(jié)構(gòu)中的主消息表明了消息的類型, 例如是鍵盤消息還是鼠標(biāo)消息等, 副消息的含義則依賴于主消息值, 例如: 如果主消息是鍵盤消息, 那么副消息中則存儲(chǔ)了是鍵盤的哪個(gè)具體鍵的信息。 GetMessage() 函數(shù)還可以過濾消息,它的第二個(gè)參數(shù)是用來指定從哪個(gè)窗口的消息隊(duì) 列中獲取消息,其它窗口的消息將被過濾掉。如果該參數(shù)為 NULL ,則 GetMessage() 從該應(yīng)用程序線程的所有窗口的消息隊(duì)列中獲取消息。 第三個(gè)和第四個(gè)參數(shù)是用來過濾 MSG 結(jié)構(gòu)中主消息值的,主消息值在 wMsgFilterMin 和 wMsgFilterM

47、ax 之外的消息將被過濾掉。如果這兩個(gè)參數(shù)為 0,則表示接收所有消息。 當(dāng)且僅當(dāng) GetMessage() 函數(shù)在獲取到 WM_QUIT 消息后, 將返回 0 值,于是程序退出消息循環(huán)。 TranslateMessage() 函數(shù)的作用是把虛擬鍵消息轉(zhuǎn)換到字符消息, 以滿足鍵盤輸入的需要。 DispatchMessage() 函數(shù)所完成的工作是把當(dāng)前的消息發(fā)送到對(duì)應(yīng)的窗口過程中去。 開啟消息循環(huán)其實(shí)是很簡(jiǎn)單的一個(gè)步驟,幾乎所有的程序都是按照 EasyWin 的這個(gè)方 法。你完全不必去深究這些函數(shù)的作用,只是簡(jiǎn)單的照抄就可以了。

48、 消息處理函數(shù) 消息處理函數(shù)又叫窗口過程,在這個(gè)函數(shù)中,不同的消息將用 switch 語句分配到不同 的處理程序中去。 Windows 的消息處理函數(shù)都有一個(gè)確定的樣式,即這種函數(shù)的參數(shù)個(gè)數(shù) 和類型以及其返回值的類型都有明確的規(guī)定。 在 VC 的說明書中, 消息處理函數(shù)的原型是這 樣定義的: LRESULT CALLBACK WindowProc( HWND hwnd, // 接收消息窗口的句柄 UINT uMsg, // 主消息值 WPARAM wParam, // 副消息值 L

49、PARAM lParam // 副消息值 ); 如果你的程序中還有其它的消息處理函數(shù), 數(shù)名稱可以隨便取。 EasyWin 中的 WinProc()  也都必須按照上面的這個(gè)樣式來定義,函數(shù)就是這樣一個(gè)典型的消息處理函數(shù)。  但函 消息處理函數(shù)的四個(gè)參數(shù)是由 GetMessage() 函數(shù)從消息隊(duì)列中獲得 MSG 結(jié)構(gòu),然后分解后得到的。第二個(gè)參數(shù) uMsg 和 MSG 結(jié)構(gòu)中的 message 值是一致的,代表了主消息值。程序中用 switch 語句來將不同類型的消息分配到不同的處理程序中去。

50、 WinProc() 函數(shù)明確的處理了 4 個(gè)消息,分別是 WM_KEYDOWN (擊鍵消息)、 WM_RBUTTONDOWN (鼠標(biāo)右鍵按下消息)、 WM_PAINT (窗口重畫消息)、 WM_DESTROY  (銷毀窗口消息)。 值得注意的是,應(yīng)用程序發(fā)送到窗口的消息遠(yuǎn)遠(yuǎn)不止以上這幾條,象  WM_SIZE  、 WM_MINIMIZE 、WM_CREATE 、WM_MOVE 等這樣頻頻使用的消息就有幾十條。為了減輕編程的負(fù)擔(dān), Windows 的 API 提供了 DefWindowProc() 函數(shù)來處理這

51、些最常用的消息,調(diào)用了這個(gè)函數(shù)后,這些消息將按照系統(tǒng)默認(rèn)的方式得到處理。 因此,在余的消息交給  switch_case 語句中, 只須明確的處理那些有必要進(jìn)行特別響應(yīng)的消息, 把其 DefWindowProc() 函數(shù)來處理,是一種明智的選擇 ,也是你必須做的一件事。 結(jié)束消息循環(huán) 當(dāng)用戶按 Alt+F4 或單擊窗口右上角的退出按鈕,系統(tǒng)就向應(yīng)用程序發(fā)送一條 WM_DESTROY 的消息。在處理此消息時(shí),調(diào)用了 PostQuitMessage() 函數(shù),該函數(shù)會(huì)給 窗口的消息隊(duì)列中發(fā)送一條 WM

52、_QUIT 的消息。在消息循環(huán)中, GetMessage() 函數(shù)一旦檢索到這條消息,就會(huì)返回 FALSE ,從而結(jié)束消息循環(huán),隨后,程序也結(jié)束。 WM_CLOSE WM_DESTORY WM_QUIT 小結(jié) 本章介紹的是 Win32 編程的基礎(chǔ)知識(shí),在進(jìn)行 DirectX 編程之前,掌握它們是十分必要的。 通過本文的學(xué)習(xí),你應(yīng)該學(xué)到以下知識(shí): 如何創(chuàng)建一個(gè) Win32 應(yīng)用程序工程 用 RegisterClass() 函數(shù)注冊(cè)一個(gè)窗口類,再立即調(diào)用 CreateWindow() 函數(shù)創(chuàng)建一個(gè)窗口的實(shí)例 設(shè)置窗口的類型以及將一個(gè)消息處理函數(shù)與窗口聯(lián)系上 用一固定的模式開啟消息循環(huán) 了解消息處理函數(shù)的定義規(guī)則,如何自己定義一個(gè)窗口消息處理函數(shù) 在消息處理函數(shù)中,最后必須調(diào)用 DefWindowProc() 函數(shù)以處理那些缺省的消息 調(diào)用 PostQuitMessage() 函數(shù)以結(jié)束消息循環(huán) 來自 :

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!