windows中的訊息雖然很多,但是種類並不繁雜,大體上有3種:視窗訊息、命令訊息和控制項通知訊息。
視窗訊息大概是系統中最為常見的訊息,它是指由作業系統和控制其他視窗的視窗所使用的訊息。例如createwindow、destroywindow和movewindow等都會激發視窗訊息,還有我們在上面談到的單擊滑鼠所產生的訊息也是一種視窗訊息。
命令訊息,這是一種特殊的視窗訊息,他用來處理從乙個視窗傳送到另乙個視窗的使用者請求,例如按下乙個按鈕,他就會向主視窗傳送乙個命令訊息。
控制項通知訊息,是指這樣一種訊息,乙個視窗內的子控制項發生了一些事情,需要通知父視窗。通知訊息只適用於標準的視窗控制項如按鈕、列表框、組合框、編輯框,以及windows公共控制項如樹狀檢視、列表檢視等。例如,單擊或雙擊乙個控制項、在控制項中選擇部分文字、操作控制項的滾動條都會產生通知訊息。 她類似於命令訊息,當使用者與控制項窗**互時,那麼控制項通知訊息就會從控制項視窗傳送到它的主視窗。但是這種訊息的存在並不是為了處理使用者命令,而是為了讓主視窗能夠改變控制項,例如載入、顯示資料。例如按下乙個按鈕,他向父視窗傳送的訊息也可以看作是乙個控制項通知訊息;單擊滑鼠所產生的訊息可以由主視窗直接處理,然後交給控制項視窗處理。
其中視窗訊息及控制項通知訊息主要由視窗類即直接或間接由cwnd類派生類處理。相對視窗訊息及控制項通知訊息而言,命令訊息的處理物件範圍就廣得多,它不僅可以由視窗類處理,還可以由文件類,文件模板類及應用類所處理。
mfc的訊息傳遞時從子類開始,如果子類沒有,再尋找父類的訊息處理函式
mfc程式實際運用中處理訊息的順序
1.afxwndproc() 該函式負責接收訊息,找到訊息所屬的cwndobject,然後呼叫afxcallwndproc
2.afxcallwndproc() 該函式負責儲存訊息(儲存的content 內容主要是訊息識別符號和訊息函式)供程式實際運用以後實際運用,然後呼叫windowproc()函式
3.windowproc() 該函式負責傳送訊息到onwndmsg()函式,如果未被處理,則呼叫defwindowproc()函式
4.onwndmsg() 該函式的功能首先按位元組對訊息停止排序,對於wm_command訊息,呼叫oncommand()訊息響應函式,對於wm_notify訊息呼叫onnotify()訊息響應函式。任何被遺漏的訊息將是唯一視窗訊息。onwndmsg()函式search類的訊息映像,以找到唯一能處理任何視窗訊息的處理函式。如果onwndmsg()函式不能找到那樣的處理函式的話,則把訊息返回到windowproc()函式,由它將訊息傳送給defwindowproc()函式
5.oncommand() 該函式檢視這也許則唯一控制項通知(lparam函式不為null,如果lparam函式為空的話,說明該訊息否則控制項通知),如果它是,oncommand()函式會試圖將訊息對映到製造通知的控制項;如果他否則唯一控制項通知(或者如果控制項拒絕對映的訊息)oncommand()就會呼叫oncmdmsg()函式
6.oncmdmsg() 根據接收訊息的類,oncmdmsg()函式將在唯一稱為命令傳遞(command routing)的過程中潛在的傳遞命令訊息和控制項通知。例如:如果擁有該視窗的類是唯一框架類,則命令和通知訊息也被傳遞到檢視和文件類,並為該類尋找唯一訊息處理函式
mfc程式實際運用建立視窗的過程
1.precreatewindow() 該函式是唯一過載函式,在視窗被建立前,沒去外國疑問在該過載函式中改變建立函式(沒去外國疑問設定視窗風格等等)
2.presubclasswindow() 這也是唯一過載函式,允許首先子分類唯一視窗
3.onminmaxinfo() 該函式為訊息響應函式,響應的是wm_getminmaxinfo訊息,允許設定視窗的最大或者最小尺寸
4.onnccreate() 該函式也是唯一訊息響應函式,響應wm_nccreate訊息,傳送訊息以告訴視窗的區即將被建立
5.onnccalcsize() 該函式也是訊息響應函式,響應wm_nccalcsize訊息,功能是允許改變視窗區大小
6.oncreate() 該函式也是唯一訊息響應函式,響應wm_create訊息,傳送訊息告訴唯一視窗已經被建立
7.onsize() 該函式也是唯一訊息響應函式,響應wm_size訊息,傳送該訊息以告訴該視窗大小已經除了變化
8.onmove() 訊息響應函式,響應wm_move訊息,傳送此訊息說明視窗在移動
9.onchildnotify() 該函式為過載函式,作為部份訊息對映被呼叫,告訴父視窗即將被告知唯一視窗剛剛被建立
mfc程式實際運用關閉視窗的順序(非模態視窗)
1.onclose() 訊息響應函式,響應視窗的wm_close訊息,當關閉按鈕被單擊的時間傳送此訊息
2.ondestroy() 訊息響應函式,響應視窗的wm_destroy訊息,當唯一視窗將被銷毀時,傳送此訊息
3.onncdestroy() 訊息響應函式,響應視窗的wm_ncdestroy訊息,當唯一視窗被銷毀後傳送此訊息
4.postncdestroy() 過載函式,作為處理onncdestroy()函式的最後動作,被cwnd呼叫
mfc程式實際運用中開啟模式對話方塊的函式呼叫順序
1.domodal() 過載函式,過載domodal()成員函式
2.presubclasswindow() 過載函式,允許首先子分類唯一視窗
3.oncreate() 訊息響應函式,響應wm_create訊息,傳送此訊息以告訴唯一視窗已經被建立
4.onsize() 訊息響應函式,響應wm_size訊息,傳送此訊息以告訴視窗大小除了變化
5.onmove() 訊息響應函式,響應wm_move訊息,傳送此訊息,以告訴視窗正在移動
6.onsetfont() 訊息響應函式,響應wm_setfont訊息,傳送此訊息,以允許改變對話方塊中控制項的字型
7.oninitdialog() 訊息響應函式,響應wm_initdialog訊息,傳送此訊息以允許初始化對話方塊中的控制項,或者是建立新控制項
8.onshowwindow() 訊息響應函式,響應wm_showwindow訊息,該函式被showwindow()函式呼叫
9.onctlcolor() 訊息響應函式,響應wm_ctlcolor訊息,被父視窗傳送已改變對話方塊或對話方塊上面控制項的顏色
10. onchildnotify() 過載函式,作為wm_ctlcolor訊息的結果傳送
mfc程式實際運用中關閉模式對話方塊的順序
1.onclose() 訊息響應函式,響應wm_close訊息,當"關閉"按鈕被單擊的時間,該函式被呼叫
2.onkillfocus() 訊息響應函式,響應wm_killfocus訊息,當唯一視窗即將失去鍵盤輸入焦點以前被傳送
3.ondestroy() 訊息響應函式,響應wm_destroy訊息,當唯一視窗即將被銷毀時,被傳送
4.onncdestroy() 訊息響應函式,響應wm_ncdestroy訊息,當唯一視窗被銷毀以後被傳送
5.postncdestroy() 過載函式,作為處理onncdestroy()函式的最後動作被cwnd呼叫
開啟無模式對話方塊的順序
1.presubclasswindow() 過載函式,允許使用者首先子分類唯一視窗
2.oncreate() 訊息響應函式,響應wm_create訊息,傳送此訊息以告訴唯一視窗已經被建立
3.onsize() 訊息響應函式,響應wm_size訊息,傳送此訊息以告訴視窗大小除了變化
4.onmove() 訊息響應函式,響應wm_move訊息,傳送此訊息以告訴視窗正在移動
5.onsetfont() 訊息響應函式,響應wm_setfont訊息,傳送此訊息以允許改變對話方塊中控制項的字型
以上這一些的執行都是按給定的順序執行!
MFC命令訊息的路由
下面,我們以menu這個程式為例,來看看 選單命令訊息路由的具體過程 當單擊某個選單項時,最先接收到這個選單命令訊息的是框架類。框架類將把接收到的這個訊息交給它的子視窗。即視類,由視類首先進行處理。視類首先格局命令訊息對映機制查詢自身是否對此訊息進行了響應,如果響應了,就呼叫相應響應函式對這個訊息進...
深入解析MFC訊息響應和訊息路由
1.mfc中的訊息分為三種 1 標準訊息,也叫視窗訊息 例 wm paint,wm create,wm lbuttondown,wm char 2 命令訊息,來自選單,工具欄和加速鍵,都以wm command表示 3 控制項訊息,控制項訊息又分為三小類,第一類和標準訊息格式一樣,第二類和命令訊息格式...
090916(星期三) MFC訊息路由1
一 命令路由 command routing 1 增加乙個函式列表 類與訊息迴圈相關的函式 注意none afxwndproc global none afxcallwndproc global ccmdtarget oncmdmsg virtual cdocument oncmdmsg virtu...