VC訊息處理之一 訊息對映的工作原理

2021-04-18 19:05:03 字數 2239 閱讀 9950

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

乙個完整的mfc訊息對映包括對訊息處理函式的原型宣告、實現以及存在於訊息對映中的訊息入口。這幾部分分別存在與類的標頭檔案和實現檔案中。一般情況下除了對自定義訊息的響應外,對於標準windows 訊息的對映處理可以借助classwizard嚮導來完成。   在選定了待處理的windows 訊息後,嚮導將會根據訊息的不同而生成具有相應函式引數和返回值的訊息處理**框架。下面這段**給出了乙個完成的mfc訊息對映過程:

// 在.h檔案中的宣告 //}afx_msg

declare_message_map() …… // 在.cpp檔案中的實現 begin_message_map(cmessagemapview, cview) //}afx_msg_map

end_message_map() …… void cmessagemapview::onmove(int x, int y)

這裡對windows標準訊息wm_move做了訊息對映,其中用到的begin_message_map、end_message_map 和標頭檔案中的declare_message_map等均是用於訊息對映的巨集。這些巨集宣告了在應用程式框架中可用於在系統中瀏覽所有物件對映的成員變數和 函式。除了以上三個比較常見的巨集之外,mfc還提供了其他一些用於訊息對映的巨集,詳情可參見下表:

巨集名

說明

declare_message_map

在標頭檔案宣告原始檔中所含有的訊息對映

begin_message_map

標記原始檔訊息對映的開始

end_message_map

標記原始檔訊息對映的結束

on_command

將特定命令的處理委派給類的乙個成員函式

on_control

對映乙個函式到乙個定製控制通知訊息。其中,定製控制通知訊息是從乙個控制傳送到其父視窗的訊息。

on_control_range

將乙個控制id的範圍對映到乙個訊息處理函式

on_control_reflect

對映乙個由父視窗反射回控制的通知訊息

on_message

將乙個使用者自定義訊息對映到一訊息處理函式

on_notify

對映乙個控制訊息到乙個函式

on_notify_range

對映乙個控制id範圍內的控制訊息到乙個函式

on_notify_

ex對映乙個控制訊息到乙個函式,該成員函式返回false或true來表明通知是否應被傳送到下乙個物件以進行其他反應。

on_notify_ex_range

對映乙個控制id範圍內的控制訊息到乙個函式,該成員函式返回false或true來表明通知是否應被傳送到下乙個物件以進行其他反應

on_notify_reflect

對映乙個控制訊息到乙個函式。該訊息將會被控制的父視窗反射回來。

on_registered_message

對映乙個唯一的訊息到乙個將要處理該註冊訊息的函式上。該訊息是由registerwindowmessage()函式註冊的。

on_update_command_ui

對映乙個函式來處理乙個使用者介面更新命令訊息

on_update_command_ui_range

對映乙個命令id的範圍到乙個更新訊息處理函式

一般作為基類使用的cwnd類為windows訊息定義了大量視窗訊息的預設處理函式,這些函式大部分只是簡單地呼叫了windows的預設 過程,可以在派生類中對其進行過載。但是mfc應用程式框架卻並沒有象使用普通虛函式那樣使用windows訊息處理函式,而是通過巨集將指定的訊息對映到 派生類的成員函式。如果mfc仍象普通虛函式一樣對訊息響應函式進行處理,那麼cwnd類就要為這上百個訊息宣告虛函式。而c++將為在程式中使用的每一 個派生類都提供乙個被稱作vtable的虛函式分配表,這個分配表需要為每乙個虛函式提供乙個4位元組的入口,而不管這些函式在派生類中是否真正被過載, 這將不能有效利用儲存空間。而且對於每乙個不同型別的視窗或控制項,應用程式都要為其提供乙個超過400位元組的虛函式分配表來實現對訊息的響應。而採用 mfc的用巨集將windows訊息對映到c++成員函式的方式則可避免產生龐大的虛函式分配表,其消耗的記憶體是同它所包含的訊息入口數量成正比的。

VC訊息處理之訊息對映

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

VC訊息處理之二 訊息對映的工作原理

任何使用了mfc應用程式框架的windows程式都含有乙個從 派生的應用程式類物件,成員函式run 將被隱含呼叫,其呼叫的cwinthread類成員函式run 將通過對 getmessage translatemessage 和dispatchmessage 等函式的呼叫完成同winmain 類似的...

VC訊息對映

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