Windows消息機制含義
Windows系統(tǒng)是一個消息驅(qū)動的OS,什么是消息呢?接下來是小編為大家收集的Windows消息機制含義,希望能幫到大家。
Windows消息機制含義
1、消息的組成:一個消息由一個消息名稱(UINT),和兩個參數(shù)(WPARAM,LPARAM)。當(dāng)用戶進行了輸入或是窗口的狀態(tài)發(fā)生改變時系統(tǒng)都會發(fā)送消息到某一個窗口。例如當(dāng)菜單轉(zhuǎn)中之后會有WM_COMMAND消息發(fā)送,WPARAM的高字中(HIWORD(wParam))是命令的ID號,對菜單來講就是菜單ID。當(dāng)然用戶也可以定義自己的消息名稱,也可以利用自定義消息來發(fā)送通知和傳送數(shù)據(jù)。
2、誰將收到消息:一個消息必須由一個窗口接收。在窗口的過程(WNDPROC)中可以對消息進行分析,對自己感興趣的消息進行處理。例如你希望對菜單選擇進行處理那么你可以定義對WM_COMMAND進行處理的代碼,如果希望在窗口中進行圖形輸出就必須對WM_PAINT進行處理。
3、未處理的消息到那里去了:M$為窗口編寫了默認(rèn)的窗口過程,這個窗口過程將負(fù)責(zé)處理那些你不處理消息。正因為有了這個默認(rèn)窗口過程我們才可以利用Windows的窗口進行開發(fā)而不必過多關(guān)注窗口各種消息的處理。例如窗口在被拖動時會有很多消息發(fā)送,而我們都可以不予理睬讓系統(tǒng)自己去處理。
4、窗口句柄:說到消息就不能不說窗口句柄,系統(tǒng)通過窗口句柄來在整個系統(tǒng)中唯一標(biāo)識一個窗口,發(fā)送一個消息時必須指定一個窗口句柄表明該消息由那個窗口接收。而每個窗口都會有自己的窗口過程,所以用戶的輸入就會被正確的處理。例如有兩個窗口共用一個窗口過程代碼,你在窗口一上按下鼠標(biāo)時消息就會通過窗口一的句柄被發(fā)送到窗口一而不是窗口二。
5、示例:下面有一段偽代碼演示如何在窗口過程中處理消息
LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM){ switch(uMessageType) {//使用SWITCH語句將各種消息分開
case(WM_PAINT): doYourWindow(...);//在窗口需要重新繪制時進行輸出
break; case(WM_LBUTTONDOWN): doYourWork(...);//在鼠標(biāo)左鍵被按下時進行處理
break; default: callDefaultWndProc(...);//對于其它情況就讓系統(tǒng)自己處理 break; }}
接下來談?wù)勈裁词窍C制:系統(tǒng)將會維護一個或多個消息隊列,所有產(chǎn)生的消息都回被放入或是插入隊列中。系統(tǒng)會在隊列中取出每一條消息,根據(jù)消息的接收句柄而將該消息發(fā)送給擁有該窗口的程序的消息循環(huán)。每一個運行的程序都有自己的消息循環(huán),在循環(huán)中得到屬于自己的消息并根據(jù)接收窗口的句柄調(diào)用相應(yīng)的窗口過程。而在沒有消息時消息循環(huán)就將控制權(quán)交給系統(tǒng)所以Windows可以同時進行多個任務(wù)。下面的偽代碼演示了消息循環(huán)的用法:
while(1){ id=getMessage(...); if(id == quit) break; translateMessage(...);}當(dāng)該程序沒有消息通知時getMessage就不會返回,也就不會占用系統(tǒng)的CPU時間。
下圖為消息投遞模式
在16位的系統(tǒng)中系統(tǒng)中只有一個消息隊列,所以系統(tǒng)必須等待當(dāng)前任務(wù)處理消息后才可以發(fā)送下一消息到相應(yīng)程序,如果一個程序陷如死循環(huán)或是耗時操作時系統(tǒng)就會得不到控制權(quán)。這種多任務(wù)系統(tǒng)也就稱為協(xié)同式的多任務(wù)系統(tǒng)。Windows3.X就是這種系統(tǒng)。
而32位的系統(tǒng)中每一運行的程序都會有一個消息隊列,所以系統(tǒng)可以在多個消息隊列中轉(zhuǎn)換而不必等待當(dāng)前程序完成消息處理就可以得到控制權(quán)。這種多任務(wù)系統(tǒng)就稱為搶先式的多任務(wù)系統(tǒng)。Windows95/NT就是這種系統(tǒng)。
看了“Windows消息機制含義”還想看: