GetMessage(), PeekMessage(), PostMessage(), SendMessage()

GetMessage () and PeekMessage ()
GetMessage 其唯一用途就是從事件對列中獲得消息,並進行處理。
當程序在等待通過 GetMessage 傳遞的消息時,主事件循壞基本上是鎖定的。即,如果消息隊列中沒有消息,則GetMessage()不會返回,一直等待..
那麼,如果我們要處理實時的事件循壞該怎麼辦呢?Windows 爲我們提供了另一個函數 PeekMessage,他們的原型幾乎是一樣的,唯一的不同是 PeekMessage 比 GetMessage 多了一個參數:UINT wRemoveMsg // removal flags。
對於wRemoveMsg ,有效的標誌有
PM_NOREMOVE,PeekMessage 處理之後,消息沒有從序列中去除
PM_REMOVE,PeekMessage 處理之後,消息已經從序列中去除
怎樣來實現實時事件循壞呢?
通過利用PeekMessage 來判斷消息序列中是否有消息,如果有,就處理它;否則繼續處理其他的遊戲邏輯並重復進行。
他們的函數原型如下:
BOOL GetMessage (
 LPMSG lpMsg, // pointer to structure for message
 HWND hWnd, // handle to window
 UINT wMsgFilterMin, // first message
 UINT wMsgFilterMax ) // last message
 
BOOL PeekMessage (
 LPMSG lpMsg, // pointer to structure for message
 HWND hWnd, // handle to window
 UINT wMsgFilterMin, // first message
 UINT wMsgFilterMax, // last message
 UINT wRemoveMsg ); // removal flags
 
SendMessage () and PostMessage ()
SendMessage 向窗口傳遞一個要求立即處理的消息。接收窗口處理完該消息後,該函數便緊接着 WinProc 返回。是同步的。
PostMessage 將消息發往窗口的消息序列,而後直接返回。如果不在意在消息被處理以前的時間延遲,或者該消息的優先級較低,就可以使用該函數。是異步的。
這兩個函數的原型幾乎一樣,唯一的不同是返回值不同。SendMessage 返回 LRESULT,PostMessage 返回的是 BOOL。他們的函數原型如下:
LRESULT SendMessage ( HWND hWnd, // handle of destination windonw
 UINT Msg, // message to send
 WPARAM wParam, // first message parameter
 LPARAM lParam); // second message parameter
 
BOOL PostMessage ( HWND hWnd, // handle of destination windonw
 UINT Msg, // message to send
 WPARAM wParam, // first message parameter
 LPARAM lParam); // second message parameter
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章