VC訊息對映

2021-08-26 16:00:52 字數 2671 閱讀 4283

vc訊息對映

2023年08月14日

視類增加乙個訊息相應函式後,在原始檔中都會增加三處**。 1 訊息相應函式原型。

在cdrawview中會有這樣的**:

// generated message map functions

protected:

//}afx_msg

declare_message_map()

在declare_message_map()巨集上有兩個afx_msg注釋巨集,在這兩個注釋巨集之間有乙個函式原型onlbuttondown,因為她位於兩個注釋巨集之間,所以是以灰色顯示,還函式宣告的前部有乙個afx_msg限定符,這也是乙個巨集。該巨集表明這個函式是乙個訊息響應函式的宣告。

afx_msg(classname):

2 on_wm_lbuttondown()訊息對映巨集

在cdrawview類的原始檔中,有如下**:

begin_message_map(cmainframe, cframewnd)

//}afx_msg_map

end_message_map()

在 上述**中,begin_message_map()和end_message_map() 這兩個巨集之間定義了cdrawview類的訊息對映表,其中有乙個on_wm_lbuttondown()這訊息對映巨集,這個巨集的作用就是吧滑鼠左鍵按下訊息wm_lbuttondown與乙個訊息相應函式關聯起來。通過這種機制,一旦有訊息產生,程式就會呼叫相應的訊息相應函式來進行處理。

3 訊息響應函式的定義

在cdrawview的原始檔中,可以看到onlbuttondown函式的定義。

mfc訊息對映機制的具體實現方法是:

在每個能接收和處理訊息的類中,定義乙個訊息和訊息函式靜態對照表,即訊息對映表。在訊息對映表中,訊息和對應的訊息處理指標是成對出現的。某個類能處理的所有訊息及其對應的訊息處理函式的位址都列在這個類所對應的靜態表中。當有訊息需要處理時,程式只要搜尋該訊息靜態表,檢視表中是否含有該訊息,就可知道該類能否處理該訊息,如果能處理該訊息,則同樣依照靜態錶能很容易找到並呼叫對應的訊息處理函式。

mfc訊息對映的具體實現過程。mfc在後台維護了乙個視窗控制代碼和對應的c++物件的對照表,以乙個例項cdrawview類為例,與它的物件相關的有乙個視窗,視窗當然有它的視窗控制代碼,該控制代碼與cdrawview物件的乙個指標存在這意義對應關係,在視窗控制代碼與c++對招標中就維護了這種對應關係。當收到某一訊息時,訊息的第乙個引數就指明該訊息與那個視窗控制代碼相關,通過對照表,就可以找到與之相關的c++物件指標。然後把這個指標傳遞給應用程式框架視窗類的基類,後者會呼叫乙個名為windowproc的函式。 其具體**如下:

lresult cwnd::windowproc(uint message, wparam wparam, lparam lparam)

根據windowproc函式的定義,我們發現它是乙個虛函式。同時,也發現,cwnd::windowproc函式內部呼叫了乙個onwndmsg的函式,真正的訊息路由,也就是訊息對映就是由此函式完成的。cwnd::onwndmsgvirtual bool onwndmsg( uint message, wparam wparam, lparam lparam, lresult* presult );

return value

nonzero if message was handled; otherwise 0.

parameters

message

specifies the message to be sent.

wparam

specifies additional message-dependent information.

lparam

specifies additional message-dependent information.

presult

the return value of windowproc. depends on the message; may be null.

//cwnd::windowproc

virtual lresult windowproc( uint message, wparam wparam, lparam lparam );//

nwndmsg部分**如下:bool cwnd::onwndmsg(uint message, wparam wparam, lparam lparam, lresult* presult)

return false;

} // special case for notifies

if (message == wm_notify)

onwndmsg函式的處理過程是:

判斷訊息是否有訊息響應函式。

判斷的方法是在相應視窗類中查詢所需的訊息響應函式。因為傳遞給windowproc函式的是視窗子類指標,所以onwndmsg會到相應的子類標頭檔案中查詢,看看declare_message_map()巨集之上,兩個afx_msg注釋巨集之間是否有相應的訊息響應函式原型的宣告;再到子類的原始檔中,看看begin_message_map()和end_message_map()之間是否有相應的訊息對映巨集。

如果通過上述步驟,找到了訊息相應函式,那麼接著就會呼叫改響應函式,對訊息進行處理。如果在子類中沒有找到訊息響應函式,那麼就交由基類進行處理。

通過以上步驟,mfc就實現了具體的訊息對映,從而完成了對訊息的相應。

VC訊息對映

vc訊息對映 2010年08月14日 視類增加乙個訊息相應函式後,在原始檔中都會增加三處 1 訊息相應函式原型。在cdrawview中會有這樣的 generated message map functions protected afx msg declare message map 在declar...

VC訊息處理之訊息對映

訊息的傳遞與傳送是windows應用程式的核心所在,任何事件的觸發與響應均要通過訊息的作用才能得以完成。在sdk程式設計中,對訊息的獲取與分發主要是 通過訊息迴圈來完成的,而在mfc程式設計中則是通過採取訊息對映的方式對其進行處理的。相比而言,這樣的處理方式要簡單許多,這也是符合物件導向程式設計中盡...

vc 訊息對映之訊息種類

在windows中應用程式有三種訊息 視窗訊息,命令訊息,控制項訊息。1 視窗訊息 一般和視窗內部運作有關,如建立視窗,繪製視窗,銷毀視窗,通常,訊息是從系統發到視窗,或從視窗發到系統。傳送函式sendmessage 或postmessage 包涵的三個變數解釋如下 message wm wpara...