00. 目錄
01. 概述
02. 消息映射宏
2.1 begin_message_map
2.2 declare_message_map
2.3 end_message_map
2.4 on_command
2.5 on_olecmd
03. 委托和接口映射宏
04. 使用消息映射交叉引用
05. 子視窗通知消息處理程式
06. wm_ 消息的處理程式
07. 使用者定義的處理程式
08. 附錄
引用的此部分列出了所有 消息映射宏 以及所有 cwnd 消息映射項以及相應的成員函數原型:
類别
描述
on _ 指令消息處理程式
處理 <code>wm_command</code> 由使用者菜單選擇或菜單通路鍵生成的消息。
子視窗通知消息處理程式
從子視窗處理通知消息。
wm_ 消息處理程式
處理 wm_ 消息,如 wm_paint 。
使用者定義的消息處理程式
處理使用者定義的消息。
由于 windows 是一種面向消息的作業系統,是以 windows 環境的大部分程式設計操作都涉及消息處理。 每次發生擊鍵或滑鼠單擊事件時,都會将一條消息發送到應用程式,然後該應用程式必須處理該事件。
microsoft 基礎類庫提供了為基于消息的程式設計而優化的程式設計模型。 在此模型中,“消息映射” 用于指定哪些函數将處理特定類的各種消息。 消息映射包含一個或多個宏,這些宏指定哪些消息将由哪些功能處理。 例如,包含宏的消息映射 <code>on_command</code> 可能類似于:
<code>on_command</code>宏用于處理由菜單、按鈕和快捷鍵生成的指令消息。 可以使用宏來映射以下内容:
windows 消息
控制通知
使用者定義的消息
指令消息
已注冊的使用者定義消息
使用者界面更新消息
消息範圍
指令
更新處理程式消息
消息映射聲明和分界宏
名稱
declare_message_map
聲明将在類中使用消息映射來将消息映射到函數(必須在類聲明中使用)。
begin_message_map
開始消息映射的定義(必須在類實作中使用)。
begin_template_message_map
開始對包含單個模闆參數的類類型的消息映射的定義。
end_message_map
結束消息映射的定義(必須在類實作中使用)。
消息映射宏
on_command
訓示哪個函數将處理指定的指令消息。
on_command_ex
on_control
訓示哪個函數将處理指定的控件通知消息。
on_message
訓示哪個函數将處理使用者定義的消息。
on_olecmd
訓示哪個函數将處理 docobject 或其容器中的菜單指令。
on_registered_message
訓示哪個函數将處理已注冊的使用者定義消息。
on_registered_thread_message
訓示哪個函數将在您具有 cwinthread 類時處理已注冊的使用者定義消息。
on_thread_message
訓示哪個函數将在您具有 cwinthread 類時處理使用者定義的消息。
on_update_command_ui
訓示哪個函數将處理指定的使用者界面更新指令消息。
消息映射範圍宏
on_command_range
訓示哪個函數将處理在宏的前兩個參數中指定的指令 id 的範圍。
on_update_command_ui_range
訓示哪個更新處理程式将處理在宏的前兩個參數中指定的指令 id 的範圍。
on_control_range
訓示哪個函數将處理來自在宏的第二個和第三個參數中指定的控件 id 的範圍的通知。 第一個參數是控件通知消息,如 bn_clicked。
常用說明
備注
在實作 ( .cpp) 檔案中,該檔案定義了類的成員函數,啟動帶有 begin_message_map 宏的消息映射,然後為每個消息處理函數添加宏項,并通過 end_message_map 宏完成消息映射。
聲明類定義消息映射。 <code>ccmdtarget</code>程式中的每個派生類必須提供消息映射來處理消息。
在類聲明的末尾使用 declare_message_map 宏。 然後,在定義類的成員函數的 .cpp 檔案中,使用 begin_message_map 宏、每個消息處理函數的宏項和 end_message_map 的宏。
如果在 declare_message_map 後聲明任何成員,則必須為它們指定新的通路類型 (<code>public</code> 、 <code>private</code> 或 <code>protected</code>) 。
示例
結束消息映射的定義。
此宏将指令消息映射到成員函數。
參考示例
它訓示哪個函數将處理指令使用者界面對象(如菜單項或工具欄按鈕)的指令消息。 當指令目标對象收到具有指定 id 的 windows wm_command 消息時,on_command 将調用成員函數 <code>memberfxn</code> 來處理該消息。 使用 on_command 将單個指令映射到成員函數。 使用 on_command_range 将一系列指令 id 映射到一個成員函數。 隻有一個消息映射項可以比對給定的指令 id。 也就是說,不能将指令映射到多個處理程式。 有關詳細資訊和示例,請參閱 消息處理和映射主題。
通過指令排程接口路由指令 <code>iolecommandtarget</code> 。
<code>iolecommandtarget</code> 允許容器接收源自 docobject 的使用者界面的指令,并允許容器在 “檔案” 菜單上發送相同的 (指令,如 “建立”、“打開”、“另存” 和 “列印”。以及複制、粘貼、撤消等操作,請在 “編輯” 菜單中) docobject。 <code>iolecommandtarget</code> 比 ole 自動化的更簡單 <code>idispatch</code> 。 <code>iolecommandtarget</code> 完全依賴于一組标準的指令,這些指令很少包含參數,并且不涉及任何類型資訊 (指令參數的類型安全降低) 。 如果确實需要排程帶有參數的指令,請使用 coleserverdoc:: onexecolecmd。 <code>iolecommandtarget</code>标準菜單指令已由 mfc 在下列宏中實作: on_olecmd_clearselection ( ) 排程 “編輯清除” 指令。 實作方式:
on_olecmd_copy ( ) 排程編輯複制指令。 實作方式:
on_olecmd_cut ( ) 排程 “編輯剪切” 指令。 實作方式:
on_olecmd_new ( ) 排程 file new 指令。 實作方式:
on_olecmd_open ( ) 排程檔案打開指令。 實作方式:
on_olecmd_pagesetup ( ) 排程檔案頁面設定指令。 實作方式:
on_olecmd_paste ( ) 排程 “編輯粘貼” 指令。 實作方式:
on_olecmd_pastespecial ( ) 排程 “編輯” “選擇性粘貼” 指令。 實作方式:
on_olecmd_print ( ) 排程檔案列印指令。 實作方式:
on_olecmd_printpreview ( ) 排程檔案 “列印預覽” 指令。 實作方式:
on_olecmd_redo ( ) 排程編輯重做指令。 實作方式:
on_olecmd_save ( ) 排程檔案儲存指令。 實作方式:
on_olecmd_save_as ( ) 排程檔案的 “另存為” 指令。 實作方式:
on_olecmd_save_copy_as ( ) 排程 “檔案另存為” 指令。 實作方式:
on_olecmd_selectall ( ) 排程 “編輯全部選擇” 指令。 實作方式:
on_olecmd_undo ( ) 排程 “編輯” 撤消指令。 實作方式:
mfc 為委托和接口映射支援以下宏:
begin_delegate_map
開始一個委托映射。
begin_interface_map
開始接口映射的定義。
commandhandler 委托
向指令源注冊回調方法。
end_delegate_map
結束委托映射。
end_interface_map
終止實作檔案中的接口映射。
event_delegate_entry
在委托映射中建立條目。
interface_part
用于 begin_interface_map 宏與對象将支援的每個接口的 end_interface_map 宏。
make_delegate
将事件處理程式附加到托管控件。
在标記為的項中 ,為派生的 cwnd 類編寫你自己的成員函數。 将函數命名為您喜歡的任何名稱。 其他函數,如 <code>onactivate</code>,是 <code>cwnd</code> 類的成員函數。 如果調用這些函數,則會傳遞消息給 <code>defwindowproc</code> windows 函數。 要處理 windows 通知消息,請重寫派生類中相應的 <code>cwnd</code> 函數。 您的函數應調用基類中的重寫函數使基類和 windows 響應消息。
在所有情況下,請将函數原型放在 <code>cwnd</code> 派生的類标頭中,并對消息映射條目進行編碼,如下所示。
使用了以下術語:
術語
定義
id
任何使用者定義的菜單項 id(wm_command 消息)或控件 id(子視窗通知消息)。
“message”和“wnotifycode”
在 windows.h 中定義的 windows 消息 id。
nmessagevariable
包含 windows 函數傳回值的變量的名稱 <code>registerwindowmessage</code> 。
有五種類别的子視窗通知消息:
泛型控件處理程式
泛型控件通知代碼的處理程式。
使用者按鈕處理程式
使用者按鈕通知代碼的處理程式。
組合框處理程式
組合框通知代碼的處理程式。
編輯控件處理程式
編輯控件通知代碼的處理程式。
清單框處理程式
清單框通知代碼的處理程式。
以下主題對應于映射條目。
主題
映射條目
a - c
通過 on_wm_ctlcolor on_wm_activate
d - e
通過 on_wm_erasebkgnd on_wm_deadchar
f - k
通過 on_wm_killfocus on_wm_fontchange
l - m
通過 on_wm_moving on_wm_lbuttondblclk
n - o
通過 on_wm_ncrbuttonup on_wm_ncactivate
p - r
通過 on_wm_renderformat on_wm_paint
s
通過 on_wm_syskeyup on_wm_setcursor
t - z
通過 on_wm_wininichange on_wm_timechange
以下映射項對應于函數原型。
函數原型
on_message ( , )
afx_msg lresult memberfxn ( wparam,lparam ) ;
on_registered_message ( , )
on_thread_message ( , )
afx_msg void memberfxn ( wparam、lparam ) ;
on_registered_thread_message ( , )