深入解析MFC訊息響應和訊息路由

2021-07-15 22:22:36 字數 1809 閱讀 6679

1.mfc中的訊息分為三種

(1)標準訊息,也叫視窗訊息(例:wm_paint,wm_create,wm_lbuttondown,wm_char)

(2)命令訊息,來自選單,工具欄和加速鍵,都以wm_command表示

(3)控制項訊息,控制項訊息又分為三小類,第一類和標準訊息格式一樣,第二類和命令訊息格式一樣(不過多了乙個控制項視窗的控制代碼),第三類是wm_notify.其具體細節不是本文敘述的重點.

2.為什麼要訊息路由?什麼叫訊息路由?

3.首先說一下函式的呼叫順序.所有的三類訊息初始都被送入乙個全域性函式afxwndproc,

之後是pwnd->windowproc,pwnd->onwndmsg,在onwndmsg()中這三類訊息分道揚鑣了,其中第一類訊息由onwndmsg自己處理,第二類交給了oncommand(),第三類交給了onnotify(),下面主要說第二類的處理過程:

afxwndproc()

afxcallwndproc

pwnd->windowproc(注意,這裡的pwnd指向的是產生訊息的那個視窗,可能是cmyview,cmyframewnd等)

pwnd->onwndmsg()

pwnd->oncommand()

....

注意:windowproc和onwndmsg這兩個函式實際只有cwnd類中才有,在其它類中並沒有重寫這兩個虛函式,所以我們呼叫的是cwnd::windowproc()和cwnd::onwndmsg(),但要注意:它們的this指標是指向我們的程式中的具體類物件(這是下面運用多型的前提)。

下面以多文件為例,解析其對第二類訊息的處理過程:

對於多文件來說,命令訊息都來自我們自己的主框架視窗(cmyframewnd),因為選單是屬於主框架視窗。

afxwndproc-->cwnd::windproc()-->cwnd::onwndmsg()(此處三類訊息分道揚鑣)-->cmyframewnd::oncommand(不存在)-->cmdiframewnd::oncommand(),

下面是cmdiframewnd::oncommand()的源**:

父框架視窗是先認子框架視窗來處理,如果其不處理,再自己處理。

那子框架視窗又是如何處理的呢?由於子框架視窗沒有重寫上面的windowproc,onwndmsg,oncommand,所以最終呼叫的是其父類cframewnd::oncommand().注意:這裡雖然呼叫了兩次cframewnd::oncommand,

但其this指標卻不同,乙個this指標指向的是cmychildwnd,乙個指向的是cframewnd.下面是cframewnd::oncommand()源**:

那cmyview又是如何處理的呢,下面是其cview::oncmdmsg()源**

cmyview是先讓自己處理,如果其不處理,再讓其對應的document處理,而document是先自己處理,如果自己不處理,現讓cdoctemplate處理(此處這一**就不在寫出,因為通常不會讓文件模板處理)

所謂自己處理,就是呼叫ccmdtarget::oncmdmsg(),cwnd並沒有重寫這個函式,呼叫cwnd::oncmdmsg就是呼叫ccmdtarget::oncmdmsg(),這個函式的主要幹的事情就是:呼叫getmessagemap()這個虛函式,獲得我們的子類的訊息對映表,然後把該訊息和此訊息對映表對照,看其是否有對應的訊息響應函式。如果沒有,再看其父類是否有,父類也沒有,就返回false,讓其它的類來處理了。

通過以上函式呼叫和返回順序,可以總結出其訊息處理順序:首先命令訊息來自主框架視窗,它把訊息交給了子框架視窗,子框架視窗又交給了view,view自己處理,否則就交給文件,所以最終的順序是:

對於單文件,那就比這簡單了,

MFC中訊息響應機制

由於視類視窗始終覆蓋在框架類視窗之上,因此所有操作,包括滑鼠單擊 滑鼠移動等操作都只能由視類視窗捕獲。乙個mfc訊息響應函式在程式中有三處相關資訊 函式原型 函式實現和以及用來關聯訊息和訊息響應函式的巨集。1 在訊息響應函式的原型 中,函式宣告的前部有乙個afx msg限定符,也是乙個巨集,該巨集表...

MFC訊息響應機制分析

一 引言 vc 的mfc類庫實際上是windows下c 程式設計的一套最為流行的類庫。mfc的框架結構大大方便了程式設計師 的程式設計工作,但是為了更加有效 靈活的使用mfc程式設計,了解mfc的體系結構往往可以使程式設計工作事半功倍。它合理的封裝了win32 api函式,並設計了一套方便的訊息對映...

MFC訊息響應機制(一)

由於視類視窗始終覆蓋在框架類視窗之上,因此所有操作,包括滑鼠單擊 滑鼠移動等操作都只能由視類視窗捕獲。乙個mfc訊息響應函式在程式中有三處相關資訊 函式原型 函式實現和以及用來關聯訊息和訊息響應函式的巨集。1 在訊息響應函式的原型 中,函式宣告的前部有乙個afx msg限定符,也是乙個巨集,該巨集表...