所謂Windows程序設(shè)計,就是編寫Windows系統(tǒng)的窗口應(yīng)用程序。
Windows是個多任務(wù)/多線程的操作系統(tǒng),并且還是一個事件驅(qū)動的操作系統(tǒng)。在Windows操作系統(tǒng)中,無論是系統(tǒng)產(chǎn)生的動作還是用戶在運(yùn)行應(yīng)用程序發(fā)出的操作動作都稱為事件,而消息就是用于描述某個事件發(fā)生的信息,可以說,事件是因,消息是果。例如,按下了鼠標(biāo)左鍵,就是一個事件,同時系統(tǒng)也會產(chǎn)生一條特定的消息來描述這個按鍵事件。
Windows中每一個消息所包括的信息用一個MSG結(jié)構(gòu)體來表示,其定義如下:
typedef struct tagMSG{
HWND hwnd; //獲取消息窗口句柄
UINT message; //消息標(biāo)識符(對應(yīng)整數(shù)表示)
WPARAM wParam; //記錄消息附加信息的字參數(shù)
LPARAM lParam; //記錄消息附加信息的長度參數(shù)
DWORD time; //消息被發(fā)送到消息隊(duì)列的時間
POINT pt; //消息發(fā)送時光標(biāo)所在位置
}
用戶或應(yīng)用程序的某些行為產(chǎn)生一些事件,操作系統(tǒng)遭到事件所屬的應(yīng)用程序,發(fā)送對應(yīng)的消息。然后,該消息就被加入到該應(yīng)用程序的消息隊(duì)列之中。之后,應(yīng)用程序不斷的檢查消息隊(duì)列。每當(dāng)檢查到一條消息時,應(yīng)用程序就將該消息發(fā)給與該消息所屬窗口相關(guān)的窗口過程(WndProc)。最后,窗口過程執(zhí)行與當(dāng)前消息對應(yīng)的指令。

圖1.事件驅(qū)動模型
具體一點(diǎn),Windows編程中的消息處理過程:
1.GetMessage()函數(shù)不斷偵聽?wèi)?yīng)用程序的消息隊(duì)列。
2.得到MSG,TranslateMessage()把標(biāo)識的消息的整數(shù)翻譯為對應(yīng)的常量符,如代表窗口的消息整數(shù)翻譯成WM_XXX消息表示形式,并分析解釋有關(guān)信息。
3.DispatchMessage()函數(shù)通知Windows把每個消息分發(fā)給相應(yīng)的窗口函數(shù)。應(yīng)用程序并不直接調(diào)用窗口函數(shù),而由Windows根據(jù)消息去調(diào)用窗口函數(shù),因此,窗口函數(shù)也被稱為回調(diào)函數(shù)。
句柄(handle)是Windows編程中的一個重要的概念。句柄是一個4字節(jié)長的整數(shù)值,是應(yīng)用程序中不同對象的編號,每個對象的句柄是唯一的,應(yīng)用程序通過句柄來訪問相應(yīng)的對象。