?? chapter2.txt
字號(hào):
消息傳送概念使Windows能夠?qū)崿F(xiàn)多任務(wù)。消息有四個(gè)基本來源。應(yīng)用程序可以從用戶那兒接受消息,也可以是Windows本身,應(yīng)用程序本身或者是其它應(yīng)用程序。
用戶消息包括按鍵消息、鼠標(biāo)移動(dòng)、鼠標(biāo)指點(diǎn)或單擊、菜單選擇、滾動(dòng)條的定位等。應(yīng)用程序必須花費(fèi)大量的時(shí)間來處理用戶消息。用戶產(chǎn)生的消息表明運(yùn)行程序的人希望改變應(yīng)用程序的表現(xiàn)方式。
無論何時(shí),如果狀態(tài)發(fā)生改變,將會(huì)有一個(gè)消息被發(fā)往應(yīng)用程序。一個(gè)例子是用戶單擊了應(yīng)用程序的圖標(biāo),表明他們想要將此應(yīng)用程序變?yōu)榛顒?dòng)的應(yīng)用程序。在這種情況下,Windows告訴應(yīng)用程序它的主窗口被打開了,它的大小和位置被改變了等等Windows產(chǎn)生的消息可以被處理,也可以被忽略,這跟應(yīng)用程序當(dāng)前的狀態(tài)有關(guān)。
相應(yīng)消息
在傳統(tǒng)的面向過程的C語(yǔ)言Windows應(yīng)用程序中,對(duì)于遇到的每一種消息,它都有一個(gè)相應(yīng)的過程來處理這消息。不同的窗口對(duì)相同的消息會(huì)產(chǎn)生不同的響應(yīng)。Windows把每個(gè)消息發(fā)送到應(yīng)用程序的不同窗口,而不同的窗口對(duì)相同的消息會(huì)有不同解釋。不令應(yīng)用程序需要不同的過程來處理每一種消息,每一個(gè)窗口也應(yīng)有不同的過程來處理不同的消息。窗口過程集合了應(yīng)用程序的所有消息處理過程。
消息循環(huán)
所有Windows應(yīng)用程序的一個(gè)基本組成就是消息處理循環(huán)。每一個(gè)C應(yīng)用程序都在內(nèi)部執(zhí)行這個(gè)操作。C應(yīng)用程序包含了創(chuàng)建并初始化窗口的過程,隨后是消息處理循環(huán),最后是結(jié)束應(yīng)用程序所需的一些代碼。消息循環(huán)負(fù)責(zé)處理Windows發(fā)給主程序的消息。在這兒,程序知道有了消息,并且要求Windows將消息發(fā)送到合適的窗口過程以供處理。當(dāng)消息被接受時(shí),窗口過程就執(zhí)行希望的動(dòng)作。
第八節(jié) windows的函數(shù)
Windows向應(yīng)用程序開發(fā)人員提供了數(shù)以百計(jì)的函數(shù)。這些函數(shù)的例子包括DispatchMes-sage(),PostMessage(),RegisterWindowMessage()以及SetActiveWindow()。對(duì)于使用基礎(chǔ)類庫(kù)的C++程序員,許多函數(shù)自動(dòng)被運(yùn)行。
在16位的Windows 3.x下的函數(shù)聲明包括一個(gè)pascal修飾符,這在DOS下更為有效Windows95和Windows NT下的32位應(yīng)用程序不再使用這個(gè)修飾符。如你所知,所有Windows函數(shù)的參數(shù)是通過系統(tǒng)來傳遞的。函數(shù)的參數(shù)從最右邊的參數(shù)開始向左壓入棧,這是標(biāo)準(zhǔn)的C方式。在從函數(shù)返回之前,調(diào)用過程必須按原來壓入棧的字節(jié)數(shù)調(diào)整棧指針。
第九節(jié) windows應(yīng)用程序框架
Windows頭文件:WINDOWS.H
WINDOWS.H頭文件(以及其它相關(guān)文件)是所有程序的內(nèi)在部分。傳統(tǒng)上,WINDOWS.H是所有C語(yǔ)言編寫的Windows應(yīng)用程序必需的一部分。當(dāng)在C++中使用基礎(chǔ)類庫(kù)時(shí),WINDOWS.H包括在AFXWIN.H頭文件中。
Windows應(yīng)用程序的組成
在開發(fā)Windows應(yīng)用程序的過程中有一些重要的步驟:
*用C語(yǔ)言編寫WinMain()函數(shù)和相關(guān)的窗口函數(shù),或者在C++中使用基礎(chǔ)類,比如CWinApp等。
*創(chuàng)建菜單、對(duì)話框和其它資源并把它們放入資源描述文件。
*(可選)使用Vinsual C++編譯器中的企業(yè)編輯器來創(chuàng)建對(duì)話框。
*(可選)使用Vinsual C++編譯器中的企業(yè)編輯器來創(chuàng)建對(duì)話框。
*用項(xiàng)目文件來編譯并鏈接所有的C/C++源程序和資源文件
Windows應(yīng)用程序中的組成部分
1. WinMain()函數(shù)
Windows 95和Windows NT需要一個(gè)WinMain()函數(shù)。這是應(yīng)用程序開始執(zhí)行和結(jié)束的地方。
從Windows向WinMain()傳遞四個(gè)參數(shù)。下面的代碼段演示了這些參數(shù)的使用:
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPreInst,
LPSTR 1pszCmdLine, int nCmdShow)
第一個(gè)參數(shù)hInst包含了應(yīng)用程序的實(shí)例句柄。當(dāng)應(yīng)用程序在Windows下運(yùn)行時(shí),這個(gè)數(shù)字唯一標(biāo)識(shí)了應(yīng)用程序。
第二個(gè)參數(shù)hPreInst將始終是一個(gè)NULL值,表明沒有這個(gè)應(yīng)用程序的其它實(shí)例正在運(yùn)行,因?yàn)樵赪indows 95和Windows NT下每個(gè)應(yīng)用程序都在它自己?jiǎn)为?dú)的地址空間中運(yùn)行。
第三個(gè)參數(shù)1pszCmdLine是指向一個(gè)以'/0'結(jié)尾的字符串的長(zhǎng)指針,這個(gè)字符串代表了應(yīng)用程序的命令行參數(shù)。
WinMain()的第四個(gè)參數(shù)是nCmdShow。在nCmdShow中存儲(chǔ)的整數(shù)代表了Windows預(yù)定義的許多常量中的一個(gè),它決定了窗口顯示的方式。
2. WNDCLASS
WinMain()負(fù)責(zé)注冊(cè)應(yīng)用程序的主窗口類。每個(gè)窗口類都建立在一些用戶選擇的風(fēng)格、字體、標(biāo)題字、圖標(biāo)、大小、位置等的基礎(chǔ)上。窗口類實(shí)際上是定義這些屬性的一個(gè)模板。
基本上,所有的Windows類定義都使用相同的標(biāo)準(zhǔn)C/C++結(jié)構(gòu)。下面的例子是一個(gè)說明WNDCLASSW結(jié)構(gòu)的typedef語(yǔ)句,WNDCLASS是從這兒繼承的:
typedef struct tagWNDCLASSW
UINT style;
WNDPROC 1pfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBR8USH hbrBackground;
LPCWSTR 1pszMenuName;
LPCWSTR 1pszClassName;
WNDCLASSW,*PWNDCLASSW,NEAR*NPWNDCLASSW, FAR*LPWNDCLASSW;
下面的部分討論了WNDCLASS結(jié)構(gòu)中的不同的域。其中有些域可以被賦予NULL,告訴Windows使用缺省的預(yù)定義值。
style:style域指明了類風(fēng)格。
1pfnWndProc:接受一個(gè)指向窗口函數(shù)的指針,它將執(zhí)行所有的窗口任務(wù)。
cbClsExtra:指定了必須在窗口類結(jié)構(gòu)后面分配的字節(jié)數(shù),它可以是NULL。
cbWndExtra:指定了必須在窗口實(shí)例后面分配的字節(jié)數(shù),它可以是NULL。
hInstance:定義了注冊(cè)窗口類的應(yīng)用程序?qū)嵗K仨毷且粋€(gè)實(shí)例句柄,不得是NULL。
hIconhIcon:劃定利用窗口最小化時(shí)顯示的圖標(biāo)。它可以是NULL。
hCursorhCursor:定義了應(yīng)用程序使用的光標(biāo)。這個(gè)句柄可以是NULL。
hbrBackground:提供了背景刷子的標(biāo)識(shí)符。
1pszMenuName:是指向一個(gè)以空字符結(jié)尾的字符串的指針。這個(gè)字符串是菜單的資源名。這一項(xiàng)可以為NULL。
1pszClassName:是指向一個(gè)以空字符結(jié)尾的字符串的指針。這個(gè)字符串是窗口類的名字。
3.WNDCLASSEX
Windows提供了一種擴(kuò)展的WNDCLASS定義,名為WNDCLASSEX,它允許應(yīng)用程序使用小圖標(biāo)。下面是WNDCLASSEX結(jié)構(gòu)的定義:
typedef struct WNDCLASSEX
UINT style;
WNDPROC 1pfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hbrBackground;
LPCTSTR 1pszMenuName;
LPCTSTR 1pszClassName;
HICON hIconSm;
WNDCLASSEX;
你可以看到這兩個(gè)結(jié)構(gòu)是相同的,除了WNDCLASSEX包括了hIconSm成員,這是與窗口類有關(guān)的小圖標(biāo)的句柄。
4.定義窗口類
應(yīng)用程序可以定義它們自己的窗口類,只要先定義一個(gè)合適類型的結(jié)構(gòu),然后用窗口類的信息來填充結(jié)構(gòu)的域。
下面的代碼示范了如何定義并初始化一個(gè)WNDCLASS結(jié)構(gòu)。
char szProgName[]="ProgName";
.
.
.
WNDCLASS wcApp;
.
.
.
wcApp.1pszClassName=szProgName;
wcApp.hInstance=hInst;
wcApp.1pfnWndProc=WndProc;
wcApp.hCursor=LoadCursor(NULL,IDC-ARROW);
wcApp.hIcon=NULL;
wcApp.1pszMenuName=szAppIName;
wcApp.hbrBackground=GetStockObject(WHITE-BRUSH);
wcApp.style=CS-HREDRAW| CS-VREDRAW;
wcApp.cbClsExtra=0;
wcApp.cbWndExtra=0;
if(!RegisterClass (&wcApp))
return 0;
WNDCLASS結(jié)構(gòu)中的第二個(gè)域是wcApp.hInstance,它被賦予了WinMain()被激活后返回的hInst的值。這指明了應(yīng)用程序的當(dāng)前實(shí)例。1pfnWndProc被賦予執(zhí)行所有窗口任務(wù)的窗口函數(shù)的指針地址。對(duì)于大部分應(yīng)用程序,這個(gè)函數(shù)叫做WndProc()。
注意:WndProc()是一個(gè)用戶定義而不是預(yù)定義的函數(shù)名。在賦值語(yǔ)句之前必須給出函數(shù)原型。
wcApp.hCursor域被賦予實(shí)例的光標(biāo)句柄。
當(dāng)wcApp.1pszMenuName被賦予NULL值的時(shí)候,Windows就認(rèn)為這個(gè)窗口類沒有菜單。 如果有,菜單必須有一個(gè)名字,它必須出現(xiàn)在引號(hào)里面。GetStockOject()函數(shù)返回一個(gè)刷子句柄,用于在這個(gè)類創(chuàng)建的窗口用戶區(qū)中畫出背景色。
wcApp.style窗口類風(fēng)格被設(shè)為CS-HREDRAW或CS-VREDRAW。
最后的兩個(gè)域,weApp.cbClsExtra以及wcApp.cbWndExtra經(jīng)常被設(shè)為0。這些域可以被選用以指明窗口結(jié)構(gòu)和窗口數(shù)據(jù)結(jié)構(gòu)后面應(yīng)該保留的附加字節(jié)數(shù)。
下面這段代碼用于注冊(cè)窗口類:
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -