PreTranslateMessage 與 WindowProc 的關係

PreTranslateMessage 與 WindowProc 的關係

http://topic.csdn.net/u/20070828/17/a4283e65-6176-4673-8559-5e822667b4d3.html

1:
MFC中PreTranslateMessage是GetMessage(...)函數的下一級操作,即GetMessage(...)從消息隊列中獲取消息後,交由PreTranslateMessage()處理,若其返回FALSE則再交給TranslateMessage和DispatchMessage處理(進入WindowProc);
如果對本線程的窗口用SendMessage,   則消息直接交到WindowProc處理,所以GetMessage不會取得SendMessage的消息,當然PreTranslateMessage也就不會被調用。
如果用PostMessage,則消息進入消息隊列,由GetMessage取得,PreTranslateMessage就有機會進行處理。

2:
SendMessage要區分環境,如果是對本線程的窗口SendMessage,則不經過任何消息循環,也不放入消息隊列,直接調用WindowProc,所以GetMessage和PreTranslateMessage都捕獲不到;如果SendMessage是向其它線程或其它進程的窗口發消息,則消息進入消息隊列,GetMessage和PreTranslateMessage能捕獲到這個消息。??? realy???

總結:
並不是所有的消息都會經過 PreTranslateMessage()
比如, 通過SendMessage()發到本線體的窗體的消息. 直接進入WindowProc.
比如, 我的PagePower的PreTranslateMessage()連一條消息都收不到!!!
        經過嘗試, MainDlg裏的PreTranslateMessage()也是一條消息都收不到, 看來, 是因爲的在win32中使用MFC擴展dll的問題了.

        因爲一個線程只有一個消息隊列, 也就只有一個TranslateMessage()和Dispatch的地方, 一般情況下. 呵呵.卻有很多個WindowProc, 一個窗口對應一個windowProc.
也不是所有的消息都會經過 WindowProc()
比如, 如果窗口中含有子窗口, 那麼如果鼠標滑過子窗口, 鼠標移動消息直接在PreTranslateMessage()裏面派發給了子窗口的WindowProc().

 

 

 

 

PreTranslateMessage 與WindowProc  

MFC消息控制流最具特色的地方是CWnd類的虛擬函數PreTranslateMessage(),通過重載這個函數,我們可以改變MFC的消息控制流程,甚至可以作一個全新的控制流出來。只有穿過消息隊列的消息才受PreTranslateMessage()影響,採用SendMessage()或其他類似的方式向窗口直接發送的而不經過消息隊列的消息根本不會理睬PreTranslateMessage()的存在。

      一、是否調用TranslateMessage()和DispatchMessage()是由一個名稱爲PreTranslateMessage()函數的返回值決定的,如果該函數返回TRUE,則不會把該消息分發給窗口函數處理。

二、傳給PreTranslateMessage()的消息是未經翻譯過的消息,它沒有經過TranslateMessage()處理。可以在該函數中使用(pMsg->wParam==VK_RETURN)來攔截回車鍵。

三、在WindowProc裏不能處理WM_Char消息。

四、SetWindowText會發送WM_Char給窗口。

五、PeekMessage和GetMessage的區別:

GetMessage在沒有消息的時候等待消息,cpu當然低

PeekMessage沒有消息的時候立刻返回,所以cpu佔用率高。

因爲遊戲不能靠windows消息驅動,所以要用PeekMessage();


在MFC中,PreTranslateMessage是虛函數,我們可以重載它來處理鍵盤和鼠標消息。在sdk中,這又有所不同,我們必須在回調函數中LRESULT   CALLBACK   WndProc(HWND   hWnd,   UINT   message,   WPARAM   wParam,   LPARAM   lParam)處理消息:它和PreTranslateMessage起的作用是類似的。只是MFC封裝的更好而已。

重載該函數可以實現窗口消息在派發給窗口函數TrnaslateMessage和DispatchMessae()之前的過濾.缺省的實現是完成加速鍵的翻譯.因爲您必須在你的重載版本中調用CWinApp:PreTranslateMessage()函數.很顯然,在SDK中在TranslateMassage()函數之前來實現該功能.

MFC中PreTranslateMessage是GetMessage(...)函數的下一級操作,即 GetMessage(...)從消息隊列中獲取消息後,交由PreTranslateMessage()處理,若其返回FALSE則再交給 TranslateMessage和DispatchMessage處理(進入WindowProc);  
如果用SendMessage,   則消息直接交到WindowProc處理,所以GetMessage不會取得SendMessage的消息,當然PreTranslateMessage也就不會被調用。   [Page]
如果用PostMessage,則消息進入消息隊列,由GetMessage取得,PreTranslateMessage就有機會進行處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章