日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【MFC】MFC消息映射(二)

發布時間:2024/4/24 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 環境的大部分編程操作都涉及消息處理。 每次發生擊鍵或鼠標單擊事件時,都會將一條消息發送到應用程序,然后該應用程序必須處理該事件。

Microsoft 基礎類庫提供了為基于消息的編程而優化的編程模型。 在此模型中,“消息映射” 用于指定哪些函數將處理特定類的各種消息。 消息映射包含一個或多個宏,這些宏指定哪些消息將由哪些功能處理。 例如,包含宏的消息映射 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 后聲明任何成員,則必須為它們指定新的訪問類型 (publicprivateprotected) 。

示例

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發出命令的資源或對象的菜單 ID、工具欄 ID、按鈕 ID 或其他 ID。

備注

IOleCommandTarget 允許容器接收源自 DocObject 的用戶界面的命令,并允許容器在 “文件” 菜單上發送相同的 (命令,如 “新建”、“打開”、“另存” 和 “打印”。以及復制、粘貼、撤消等操作,請在 “編輯” 菜單中) 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在委托映射中創建條目。
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消息映射(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。