【MFC】MFC消息映射(二)
00. 目錄
文章目錄
- 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. 附錄
01. 概述
引用的此部分列出了所有 消息映射宏 以及所有 CWnd 消息映射項以及相應的成員函數原型:
| ON _ 命令消息處理程序 | 處理 WM_COMMAND 由用戶菜單選擇或菜單訪問鍵生成的消息。 |
| 子窗口通知消息處理程序 | 從子窗口處理通知消息。 |
| WM_ 消息處理程序 | 處理 WM_ 消息,如 WM_PAINT 。 |
| 用戶定義的消息處理程序 | 處理用戶定義的消息。 |
由于 Windows 是一種面向消息的操作系統,因此 Windows 環(huán)境的大部分編程操作都涉及消息處理。 每次發(fā)生擊鍵或鼠標單擊事件時,都會將一條消息發(fā)送到應用程序,然后該應用程序必須處理該事件。
Microsoft 基礎類庫提供了為基于消息的編程而優(yōu)化的編程模型。 在此模型中,“消息映射” 用于指定哪些函數將處理特定類的各種消息。 消息映射包含一個或多個宏,這些宏指定哪些消息將由哪些功能處理。 例如,包含宏的消息映射 ON_COMMAND 可能類似于:
BEGIN_MESSAGE_MAP(CMyDoc, CDocument)ON_COMMAND(ID_MYCMD, &CMyDoc::OnMyCommand) END_MESSAGE_MAP()ON_COMMAND宏用于處理由菜單、按鈕和快捷鍵生成的命令消息。 可以使用宏來映射以下內容:
Windows 消息
- 控制通知
- 用戶定義的消息
命令消息
- 已注冊的用戶定義消息
- 用戶界面更新消息
消息范圍
- 命令
- 更新處理程序消息
- 控制通知
02. 消息映射宏
消息映射聲明和分界宏
| 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。 |
常用說明
2.1 BEGIN_MESSAGE_MAP
BEGIN_MESSAGE_MAP 開始您的消息映射的定義。語法 BEGIN_MESSAGE_MAP( theClass, baseClass ) parameters theClass指定其消息映射所屬的類的名稱。 baseClass指定 類 的基類的名稱。BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)ON_WM_CREATE() END_MESSAGE_MAP()備注
在實現 ( .cpp) 文件中,該文件定義了類的成員函數,啟動帶有 BEGIN_MESSAGE_MAP 宏的消息映射,然后為每個消息處理函數添加宏項,并通過 END_MESSAGE_MAP 宏完成消息映射。
2.2 DECLARE_MESSAGE_MAP
聲明類定義消息映射。 CCmdTarget程序中的每個派生類必須提供消息映射來處理消息。
DECLARE_MESSAGE_MAP( )備注
在類聲明的末尾使用 DECLARE_MESSAGE_MAP 宏。 然后,在定義類的成員函數的 .cpp 文件中,使用 BEGIN_MESSAGE_MAP 宏、每個消息處理函數的宏項和 END_MESSAGE_MAP 的宏。
如果在 DECLARE_MESSAGE_MAP 后聲明任何成員,則必須為它們指定新的訪問類型 (public 、 private 或 protected) 。
示例
class CMainFrame : public CMDIFrameWnd {DECLARE_MESSAGE_MAP()// Remainder of class declaration omitted. }2.3 END_MESSAGE_MAP
結束消息映射的定義。
END_MESSAGE_MAP( )2.4 ON_COMMAND
此宏將命令消息映射到成員函數。
ON_COMMAND( commandId, memberFxn ) parameters commandId命令 ID。 memberFxn命令映射到的消息處理程序函數的名稱。參考示例
BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)ON_COMMAND(ID_MYCOMMAND, &CMFCListViewDoc::OnMycommand) END_MESSAGE_MAP()備注
它指示哪個函數將處理命令用戶界面對象(如菜單項或工具欄按鈕)的命令消息。
當命令目標對象收到具有指定 ID 的 Windows WM_COMMAND 消息時,ON_COMMAND 將調用成員函數 memberFxn 來處理該消息。
使用 ON_COMMAND 將單個命令映射到成員函數。 使用 ON_COMMAND_RANGE 將一系列命令 id 映射到一個成員函數。 只有一個消息映射項可以匹配給定的命令 ID。 也就是說,不能將命令映射到多個處理程序。 有關詳細信息和示例,請參閱 消息處理和映射主題。
2.5 ON_OLECMD
通過命令調度接口路由命令 IOleCommandTarget 。
ON_OLECMD( pguid, olecmdid, commandId ) parameters pguid命令所屬的命令組的標識符。 對于標準組,請使用 NULL。 olecmdidOLE 命令的標識符。 commandId發(fā)出命令的資源或對象的菜單 ID、工具欄 ID、按鈕 ID 或其他 ID。備注
IOleCommandTarget 允許容器接收源自 DocObject 的用戶界面的命令,并允許容器在 “文件” 菜單上發(fā)送相同的 (命令,如 “新建”、“打開”、“另存” 和 “打印”。以及復制、粘貼、撤消等操作,請在 “編輯” 菜單中) DocObject。
IOleCommandTarget 比 OLE 自動化的更簡單 IDispatch 。 IOleCommandTarget 完全依賴于一組標準的命令,這些命令很少包含參數,并且不涉及任何類型信息 (命令參數的類型安全降低) 。 如果確實需要調度帶有參數的命令,請使用 COleServerDoc:: OnExecOleCmd。
IOleCommandTarget標準菜單命令已由 MFC 在下列宏中實現:
ON_OLECMD_CLEARSELECTION ( )
調度 “編輯清除” 命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_CLEARSELECTION, ID_EDIT_CLEAR)ON_OLECMD_COPY ( )
調度編輯復制命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_COPY, ID_EDIT_COPY)ON_OLECMD_CUT ( )
調度 “編輯剪切” 命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_CUT, ID_EDIT_CUT)ON_OLECMD_NEW ( )
調度 File New 命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_NEW, ID_FILE_NEW)ON_OLECMD_OPEN ( )
調度文件打開命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_OPEN, ID_FILE_OPEN)ON_OLECMD_PAGESETUP ( )
調度文件頁面設置命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_PAGESETUP, ID_FILE_PAGE_SETUP)ON_OLECMD_PASTE ( )
調度 “編輯粘貼” 命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_PASTE, ID_EDIT_PASTE)ON_OLECMD_PASTESPECIAL ( )
調度 “編輯” “選擇性粘貼” 命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_PASTESPECIAL, ID_EDIT_PASTE_SPECIAL)ON_OLECMD_PRINT ( )
調度文件打印命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_PRINT, ID_FILE_PRINT)ON_OLECMD_PRINTPREVIEW ( )
調度文件 “打印預覽” 命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_PRINTPREVIEW, ID_FILE_PRINT_PREVIEW)ON_OLECMD_REDO ( )
調度編輯重做命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_REDO, ID_EDIT_REDO)ON_OLECMD_SAVE ( )
調度文件保存命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_SAVE, ID_FILE_SAVE)ON_OLECMD_SAVE_AS ( )
調度文件的 “另存為” 命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_SAVEAS, ID_FILE_SAVE_AS)ON_OLECMD_SAVE_COPY_AS ( )
調度 “文件另存為” 命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_SAVECOPYAS, ID_FILE_SAVE_COPY_AS)ON_OLECMD_SELECTALL ( )
調度 “編輯全部選擇” 命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_SELECTALL, ID_EDIT_SELECT_ALL)ON_OLECMD_UNDO ( )
調度 “編輯” 撤消命令。 實現方式:
ON_OLECMD(NULL, OLECMDID_UNDO, ID_EDIT_UNDO)03. 委托和接口映射宏
MFC 為委托和接口映射支持以下宏:
| BEGIN_DELEGATE_MAP | 開始一個委托映射。 |
| BEGIN_INTERFACE_MAP | 開始接口映射的定義。 |
| CommandHandler 委托 | 向命令源注冊回調方法。 |
| END_DELEGATE_MAP | 結束委托映射。 |
| END_INTERFACE_MAP | 終止實現文件中的接口映射。 |
| EVENT_DELEGATE_ENTRY | 在委托映射中創(chuàng)建條目。 |
| INTERFACE_PART | 用于 BEGIN_INTERFACE_MAP 宏與對象將支持的每個接口的 END_INTERFACE_MAP 宏。 |
| MAKE_DELEGATE | 將事件處理程序附加到托管控件。 |
04. 使用消息映射交叉引用
在標記為的項中 ,為派生的 CWnd 類編寫你自己的成員函數。 將函數命名為您喜歡的任何名稱。 其他函數,如 OnActivate,是 CWnd 類的成員函數。 如果調用這些函數,則會傳遞消息給 DefWindowProc Windows 函數。 要處理 Windows 通知消息,請重寫派生類中相應的 CWnd 函數。 您的函數應調用基類中的重寫函數使基類和 Windows 響應消息。
在所有情況下,請將函數原型放在 CWnd 派生的類標頭中,并對消息映射條目進行編碼,如下所示。
使用了以下術語:
| id | 任何用戶定義的菜單項 ID(WM_COMMAND 消息)或控件 ID(子窗口通知消息)。 |
| “message”和“wNotifyCode” | 在 WINDOWS.H 中定義的 Windows 消息 ID。 |
| nMessageVariable | 包含 Windows 函數返回值的變量的名稱 RegisterWindowMessage 。 |
05. 子窗口通知消息處理程序
有五種類別的子窗口通知消息:
| 泛型控件處理程序 | 泛型控件通知代碼的處理程序。 |
| 用戶按鈕處理程序 | 用戶按鈕通知代碼的處理程序。 |
| 組合框處理程序 | 組合框通知代碼的處理程序。 |
| 編輯控件處理程序 | 編輯控件通知代碼的處理程序。 |
| 列表框處理程序 | 列表框通知代碼的處理程序。 |
06. WM_ 消息的處理程序
以下主題對應于映射條目。
| 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 |
07. 用戶定義的處理程序
以下映射項對應于函數原型。
| ON_MESSAGE ( , ) | afx_msg LRESULT memberFxn ( WPARAM,LPARAM ) ; |
| ON_REGISTERED_MESSAGE ( , ) | afx_msg LRESULT memberFxn ( WPARAM,LPARAM ) ; |
| ON_THREAD_MESSAGE ( , ) | afx_msg void memberFxn ( WPARAM、LPARAM ) ; |
| ON_REGISTERED_THREAD_MESSAGE ( , ) | afx_msg void memberFxn ( WPARAM、LPARAM ) ; |
08. 附錄
總結
以上是生活随笔為你收集整理的【MFC】MFC消息映射(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【MFC】MFC消息处理和映射
- 下一篇: 【MFC】MFC对话框类