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