標籤:style blog color ar div sp log on c
在Windows中,使用者程式可以調用系統的API函數,系統也會調用使用者程式,這個調用時通過訊息來進行的。
Windows程式設計是一種事件驅動方式的程式設計模式,主要基於訊息。
【例】當使用者在視窗中畫圖的時候,按下滑鼠左鍵,作業系統就會感知到這一事件,於是將這個事件封裝成一個訊息,投遞到應用程式的訊息佇列中,然後應用程式從訊息佇列中取出訊息進行響應。在處理過程中,作業系統會給應用程式“發送訊息”。“發送訊息”實際上是指作業系統調用程式中一個專門負責處理訊息的函數,這個函數稱為視窗過程。
1.訊息
在Windows中,訊息是由MSG結構體表示的。MSG結構體定義如下:
typedef struct tagMSG { // msg HWND hwnd; //表示訊息所屬的視窗 UINT message; //指定訊息的標識符 WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
結構體中:
第一個成員變數hwnd表示訊息所屬視窗。我們通常開發的應用程式都是視窗應用程式,一個訊息一般都是與某個視窗相關聯的。
第二個成員變數message指定了訊息的標識符。在windows中,訊息是由一個數值來表示的,不同的訊息對應不同的數值。為了便於記憶,windows將訊息對應的數值定義為WM_XXX宏。如,滑鼠左鍵按下的訊息是WM_LBUTTONDOWN。鍵盤按下的訊息是WM_KEYDOWN。字元訊息WM_CHAR等等。
第三個、第四個成員變數wParam和lParam,用於指定訊息的附加資訊。用於指定訊息的附加資訊。例如,當我們收到一個自負訊息的時候,message成員變數的值就是WM_CHAR,但使用者到底輸入的是什麼字元,那麼由wParam和lParam來說明。wParam、lParam表示的資訊隨訊息的不同而不同。
最後兩個變數分別表示訊息投遞到訊息佇列中的事件和滑鼠的當前位置。
2.訊息佇列
每一個Windows應用程式開始執行後,系統都會為該程式建立一個訊息佇列,這個訊息佇列用來存放該程式建立的視窗訊息。例如,當按下滑鼠左鍵的時候,將會產生WM_LBUTTONDOWN訊息,系統會將這個訊息放到視窗所屬的應用程式的訊息佇列中,等待應用程式的處理。Windows將產生的訊息依次放到訊息佇列中,而應用程式則通過一個訊息迴圈不斷地從訊息佇列中取出訊息,並且進行響應。
3.進隊訊息和不進隊訊息
進隊訊息將由系統放入到應用程式的訊息佇列中,然後由應用程式取出並發送。不進隊訊息在系統調用視窗過程時直接發給視窗。無論是進隊訊息還是不進隊訊息,最終都由調用視窗過程函數隊訊息進行處理。
第一章 Windows程式內部運行機制(3)訊息與訊息佇列