MFC將thread分成winddow thread和worker thread,在討論多現程(Multi-thread)之前,我們先只考慮window thread。
windows programming的基本工作方式和console application的不同,基本上是這樣運行的,程序從WinMain()開始,然後進入一個message loop,程序在這裏等待發給它的所有消息然後一一處理,直到接收到WM_QUIT的消息的時候,message loop終止,程序結束。所以整個主程序運行的過程就是等待消息,接收消息,然後處理消息的過程。 窗口建立的時候CreateWindow, RegisterWindow之類的不必太費心,MFC已經全管理妥當了,需要提起一點注意的是程序開始時HINSTANCE hInstance這個參數,在和DLL打交道的時候會幫你解決很多問題,如果一個Bitmap Load不上來,或者一個Dialog DoModal之後不出來,估計就得向這個參數求助了,這是後話。 具體處理的消息的函數叫window procedure,具體處理消息的code叫message handler。它可以是當前應用程序的API,也可以是調用的不同DLL的API。不同的DLL叫不同的module。以後的文章中我會具體說明module state。是個很重要的話題。(當項目大的時候) 沒有message handler的消息交給DefWindowProc()函數處理,差不多可以理解爲什麼也不作了。 消息包括四個參數,window handle,message ID,和另外兩個參數wParam, lParam。window handle可以作爲window的識別ID來用。所以在發送消息的時候如果可以有兩種格式: pWnd->SendMessage(message, wParam = 0, lParam); 發送消息如果用SendMessage消息將立刻發送,如果用PostMessage,消息將進入Message queue按當前順序發送,一般沒有特別的要求PostMessage已經足夠了。 由於可能收到的信息種類很多,用傳統的switch來處理在程序中會顯得很亂,於是MFC採用了Message Map機制。Message Map 機制實現了收到的信息和處理信息函數的mapping。在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間定義的消息會在window接收到之後一一傳給對應的message handler處理。 所有用於處理信息的函數的申明需要有afx_msg關鍵字。對於系統所要處理的message,ON_WN_XXX 一般跟三個參數,WPARAM(wParam),LOWORD(lParam) 和HIWORD(lParam).用不到的參數會省略。 下面列舉一下Message Map中可能用到的關於宏 1。Window間SendMessage或PostMessage收到的消息如果是系統將要管理的,在Message Map中一般用ON_WM_XXX。“XXX”是具體消息名字。例如畫窗口是ON_WM_PAINT。如果是自定義的消息ON_MESSAGE()。例如窗口pWndA發消息給窗口pWndB。pWndB->PostMessage(WM_MYMSG1),那麼Window B要處理這個消息需要在Message Map裏面寫上 ON_MESSAGE(WM_MYMSG1, OnMessage1),然後寫OnMessage1函數作message handler。WM_MYMSG1的定義應放在user message中,WM_USER+NNN。注意最好不要和其它已有的ID重複,這個沒有辦法自動檢查。 2。ON_COMMAND,ON_UPDATE_COMMAND_UI,ON_COMAND_RANGE 4。ON_REGISTERED_MESSAGE |
Window消息傳遞機制
Window消息傳遞機制
2007-03-10 23:12
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.