天天看點

【MFC】MFC消息映射(二)

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 ( , )

繼續閱讀