Windows系統是一個消息驅動的OS,什麼是消息呢?下麵從不同的幾個方面講解一下。 1、消息的組成:一個消息由一個消息名稱(UINT),和兩個參數(WPARAM,LPARAM)。當用戶進行了輸入或是視窗的狀態發生改變時系統都會發送消息到某一個視窗。例如當菜單轉中之後會有WM_COMMAND消息發送 ...
Windows系統是一個消息驅動的OS,什麼是消息呢?下麵從不同的幾個方面講解一下。
1、消息的組成:一個消息由一個消息名稱(UINT),和兩個參數(WPARAM,LPARAM)。當用戶進行了輸入或是視窗的狀態發生改變時系統都會發送消息到某一個視窗。例如當菜單轉中之後會有WM_COMMAND消息發送,WPARAM的高字中(HIWORD(wParam))是命令的ID號,對菜單來講就是菜單ID。當然用戶也可以定義自己的消息名稱,也可以利用自定義消息來發送通知和傳送數據。
2、誰將收到消息:一個消息必須由一個視窗接收。在視窗的過程(WNDPROC)中可以對消息進行分析,對自己感興趣的消息進行處理。例如你希望對菜單選擇進行處理那麼你可以定義對WM_COMMAND進行處理的代碼,如果希望在視窗中進行圖形輸出就必須對WM_PAINT進行處理。
3、未處理的消息到那裡去了:M$為視窗編寫了預設的視窗過程,這個視窗過程將負責處理那些你不處理消息。正因為有了這個預設視窗過程我們才可以利用Windows的視窗進行開發而不必過多關註視窗各種消息的處理。例如視窗在被拖動時會有很多消息發送,而我們都可以不予理睬讓系統自己去處理。
4、視窗句柄:說到消息就不能不說視窗句柄,系統通過視窗句柄來在整個系統中唯一標識一個視窗,發送一個消息時必須指定一個視窗句柄表明該消息由那個視窗接收。而每個視窗都會有自己的視窗過程,所以用戶的輸入就會被正確的處理。例如有兩個視窗共用一個視窗過程代碼,你在視窗一上按下滑鼠時消息就會通過視窗一的句柄被髮送到視窗一而不是視窗二。
5、示例:下麵有一段偽代碼演示如何在視窗過程中處理消息
LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)
{
switch(uMessageType)
{//使用SWITCH語句將各種消息分開
case(WM_PAINT):
doYourWindow(...);//在視窗需要重新繪製時進行輸出
break;
case(WM_LBUTTONDOWN):
doYourWork(...);//在滑鼠左鍵被按下時進行處理
break;
default:
callDefaultWndProc(...);//對於其它情況就讓系統自己處理
break;
}
}
接下來談談什麼是消息機制:系統將會維護一個或多個消息隊列,所有產生的消息都回被放入或是插入隊列中。系統會在隊列中取出每一條消息,根據消息的接收句柄而將該消息發送給擁有該視窗的程式的消息迴圈。每一個運行的程式都有自己的消息迴圈,在迴圈中得到屬於自己的消息並根據接收視窗的句柄調用相應的視窗過程。而在沒有消息時消息迴圈就將控制權交給系統所以Windows可以同時進行多個任務。
博主是一個有著7年工作經驗的架構師,對於c++,自己有做資料的整合,一個完整學習C語言c++的路線,學習資料和工具。可以進我的Q群7418,18652領取,免費送給大家。希望你也能憑自己的努力,成為下一個優秀的程式員!另外博主的微信公眾號是:C語言編程基地,歡迎關註!