MFC架构之CCmdTarget类

MFC 详解一之重要的 最近好久没用vs下的mfc工程了,感觉对于mfc越来越感到莫名的陌生不了解,网上也看到好多关于mfc的深入了解的博客,其中liyi268这位前辈对于mfc六大机制总结的很到位,还有就是《深入浅出 MFC》侯俊杰的这本书更是没话说,一直犹豫要不要写mfc方面的博客,最终想想为什么不写呢,也许自身的水平有限,也许投入写mfc博客的时间会比较长,但是自身总结一方面能加深印象,促使自己更加深入的了解,一方 阅读详情

       类CCmdTarget是MFC类库中消息映射体系的一个基类。所有响应消息或事件的类都从它派生。例如,CWinApp,CWnd,CDocument,CView,CDocTemplate,CFrameWnd,等等。
       CCmdTarget类是MFC处理命令消息的基础、核心。MFC为该类设计了许多成员函数和一些成员数据,基本上是为了解决消息映射问题的,而且,很大一部分是针对OLE设计的。在OLE应用中,CCmdTarget是MFC处理模块状态的重要环节,它起到了传递模块状态的作用:其构造函数获取当前模块状态,并保存在成员变量m_pModuleState里头。

       CmdTarget有两个与消息映射有密切关系的成员函数:DispatchCmdMsg和OnCmdMsg。

1.静态成员函数DispatchCmdMsg
CCmdTarget的静态成员函数DispatchCmdMsg,用来分发Windows消息。此函数是MFC内部使用的,其原型如下:
static BOOL DispatchCmdMsg(
CCmdTarget* pTarget,UINT nID,int nCode,AFX_PMSG pfn,
void* pExtra,UINT nSig,AFX_CMDHANDLERINFO* pHandlerInfo)。

2. 虚拟函数OnCmdMsg
CCmdTarget的虚拟函数OnCmdMsg,用来传递和发送消息、更新用户界面对象的状态,其原型如下:
OnCmdMsg(UINT nID,int nCode,void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo);
    框架的命令消息传递机制主要是通过该函数来实现的。本文中命令目标指希望或者可能处理消息的对象;命令目标类指命令目标的类。
CCmdTarget对OnCmdMsg的默认实现:在当前命令目标(this所指)的类和基类的消息映射数组里搜索指定命令消息的消息处理函数(标准Windows消息不会送到这里处理)。这里使用虚拟函数GetMessageMap得到命令目标类的消息映射入口数组_messageEntries,然后在数组里匹配指定的消息映射条目。匹配标准:命令消息ID相同,控制通知代码相同。因为GetMessageMap是虚拟函数,所以可以确认当前命令目标的确切类。如果找到了一个匹配的消息映射条目,则使用DispachCmdMsg调用这个处理函数;如果没有找到,则使用_GetBaseMessageMap得到基类的消息映射数组,查找,直到找到或搜寻了所有的基类(到CCmdTarget)为止;如果最后没有找到,则返回FASLE。
      每个从CCmdTarget派生的命令目标类都可以覆盖OnCmdMsg,利用它来确定是否可以处理某条命令,如果不能,就通过调用下一命令目标的OnCmdMsg,把该命令送给下一个命令目标处理。通常派生类覆盖OnCmdMsg时,要调用基类的被覆盖的 OnCmdMsg。
      在MFC框架中,一些MFC命令目标类覆盖了OnCmdMsg,如框架窗口类覆盖了该函数,实现了MFC的标准命令消息发送路径。
必要的话,应用程序也可以覆盖OnCmdMsg,改变一个或多个类中的发送规定,实现与标准框架发送规定不同的发送路径。例如,在以下情况可以作这样的处理:在要打断发送顺序的类中把命令传给一个非MFC默认对象;在新的非默认对象中或在可能要传出命令的命令目标中。

 

CCmdTarget还有以下三个函数

1.BeginWaitCursor  显示沙漏标
2.EnableAutomation  允许CCmdTarget对象的OLE自动函数
3.RestoreWaitCursor  重置沙漏标

实例:

深入解析MFCCCmdTarget:消息处理与命令目标的基石 CCmdTargetMFC框架的核心基,提供消息处理、命令路由和OLE自动化支持。摘要要点如下: 核心功能: 消息映射机制(BEGIN_MESSAGE_MAP/END_MESSAGE_MAP) 命令路由(OnCmdMsg处理CN_COMMAND/CN_UPDATE_COMMAND_UI) OLE自动化支持(EnableAutomation/GetIDispatch) 典型应用: 实现自定义命令系统(注册/执行命令) 处理反射消息(OnChildNotify) 管理OLE对象生命周期(ExternalAd 阅读详情

相关推荐

MFC Active控件运行没问题,退出时CCmdTarget::CCmdTarget()报:line 40 断言失败,如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1203

MFC:总结篇 CCmdTarget

一.简介 CCmdTarget 是CObject 的子 所有响应消息或事件的都从它派生,例如: CWinapp CWnd CDocument CView CDocTemplate CFrameWnd等 CCmdTarget MFC 处理命令消息的基础核心 转载于:https://www.cnblogs.com/k5bg/p/11214203.html...

weixin_30446613的博客 659

CmdTarget.cpp

// BEGIN_MESSAGE_MAP(theClass, baseClass) // END_MESSAGE_MAP()const AFX_MSGMAP* theClass::GetMessageMap() const {  return &theClass::messageMap; }const AFX_MSGMAP theClass::messageMap = {  &baseClass:

种田能手 1922

CmdTarget.h

struct AFX_MSGMAP_ENTRY{ unsigned int nMessage;   // windows消息 unsigned int nCode;      // control code or WM_NOTIFY code unsigned int nID;        // control ID (or 0 for windows messages) unsigned in

种田能手 1808

MFC CCmdTarget Class成员变量及成员函数

派生于CObject,它封装了MFC的消息映射机制,希望接收系统事件和窗口消息的都从它派生,如CDocument和CWnd分支。此外,在系统繁忙,无法响应窗口消息时,鼠标光标应该显示为沙漏形等待状态,CCmdTarget封装了3个成员函数完成该功能。CCmdTarget以一种似消息映射的机制提供IDispatch接口,所以使用MFC可以轻松地编写AUTOMATION客户程序和组件。

海纳百川,有容乃大。 1498

关于CCmdTarget及消息映射

CCmdTarget直接继承自CObject,主管应用程序架构,其向下直接派生出CWnd,而CWnd是所有控件、框架窗口、对话框、视图的父CCmdTarget是可以在里面使用消息映射的,其派生的所有都有消息映射函数。能用消息映射的的基都必须是CCmdTargetCCmdTarget的派生在头文件中都必须提供DECLARE_MESSAGE_MAP()宏,在的CPP文件中都有相应的BEGIN_MESSAGE_MAP(当前, 直接父)和END_MESSAGE_MAP()宏与

hohoyu的专栏 1492

MFC总结

一、MFC库概述 MFC(Microsoft Foundation class)微软基本(库),有时候也有人叫做微软基本库,因为它确实是一个库(物理上讲),而且非常庞大;它也是一个面向对象的应用程序架构(逻辑上),程序员利用它可以很方便搭建应用程序框架MFC结合了面向对象的编程技术和WINDOWS消息驱动的编程技术,并封装了WIN32API,其设计好处:消除了WIN32API的复杂性,封装了WIN32API,统一了程序的概念,而且可扩展。MFC由AFX项目小组进化而来,还有一些AFX代码,如Af

保护大苹果 741

MFC深入-1.MFC是一个编程框架

因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。例如,SDI应用程序的模板,MDI应用程序的模板,规则DLL应用程序的模板,扩展DLL应用程序的模板,OLE/ACTIVEX应用程序的模板,等等。这样,通过虚拟函数和消息映射,MFC提供了丰富的编程接口。这些或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下。

qq_41237850的博客 477

CCmdTarget

派生于CObject,它封装了MFC的消息映射机制,希望接收系统事件和窗口消息的都从它派生,如CDocument和CWnd分支。此外,在系统繁忙,无法响应窗口消息时,鼠标光标应该显示为沙漏形等待状态,CCmdTarget封装了3个成员函数完成该功能。封装COM的 IDispatch接口是它的另一项主要功能。IDispatch是COM的标准接口,不含指针操作的语言(如VB)以及描述性语言(如

WINCOL的专栏 3912

vc++学习笔记—11月14日

第三章 应用程序框架句柄HWND 窗口句柄 HBITMAP 位图句柄HICON 图标句柄HMENU 菜单句柄HFILE 文件句柄HINSTANCE 当前实例句柄HGLOBAL 全局内存对象句柄HDC 设备环境句柄HCURSOR 光标句柄HFONT 字体句柄HPEN 画笔句柄HBRUSH 画刷句柄HLOCAL 局部内存对象句柄旁注:char是char[]的首地址同样 main是main()的

Lepto_Neek 1731

CCmdTarget

CCmdTarget CCmdTargetMFC库中消息映射体系的一个基。消息映射把命令或消息引导给用户为之编写的响应函数(命令是由菜单项、命令按钮或者加速键产生的消息)。从CCmdTarget继承来的按键框架包括:C

firectrl的专栏 4870

MFC常见的

MFC常见的CCmdTarget:是MFC库中消息(消息分为:标准消息(只有由CWnd派生来的才可以接受到此消息)、命令消息(CCmdTarget的派生都可以接收到此消息)、通知消息)映射体系的一个基,是MFC处理命令消息的基础、核心。消息映射把命令或消息引导给用户为之编写的响应函数。 CWnd:窗口,   它是大多数“看得见的东西”的父Windows里几乎所有看得见的

钢部的博客 3646

常用的MFC

常用的MFCCRuntimeClass结构在CRuntimeClass结构中定义了名、对象所占存储空间的大小、的版本号等成员变量及动态创建对象、派生关系判断等成员函数。每一个从CObject派生的都有一个CRuntimeClass结构同它关联,以便完成在运行时得到对象的信息或基的信息。要使用CRuntimeClass结构,必须结合使用RUNTIME_CL

liviatt的专栏 964

C++ MFC/BCG编程(一):MFC简介及MFC库概述

MFC(Microsoft Foundation Classes Library,微软基础库)是微软公司推出的一套用于Windows平台的C++库,它基于Win32 API进行封装,提供了面向对象的编程接口,旨在简化Windows应用程序的开发过程。通过MFC,开发者可以不必直接与底层的Win32 API打交道,而是利用MFC提供的和对象来快速构建出具有标准用户界面的应用程序。VC++全称Visual C++,是由微软提供的C++开发工具,是用C++语言编写程序的工具平台。

qq_39281631的博客 2477

MFC说明

1.CObjectMFC,该下面有一个重要的CCmdTarget。而CCmdTarget下面又有四个重要的继承,分别为:CWinThread、CDocument、CDocTemplate、        CWnd。所以,可以得出一个大概继承图,如图所示:                      CObject--->CCmdTarget ---->CWinThread --

蜡笔小辛的专栏 2270

CCmdTarget

CCmdTarget Class Microsoft基础库选件消息映射体系结构的基。   公共构造函数 名称 说明 CCmdTarget::CCmdTarget 构造 CCmdTarget 对象。 公共方法

heary29的专栏 1331

MFC

MFC说明 CObject:CObject是MFC的根,绝大多数MFC是其派生的,CObject 实现了一些重要的特性,包括动态信息、动态创建、对象序列化、对程序调试的支持,等等。CObject定义了一个CRuntimeClass型的静态成员变量:CRuntimeClass classCObject,还定义了几组函数:构造函数析构函数,诊断函数,与运行时信息相关的函数,与串行化相关

xwj102的专栏 1025
上一篇: MFC架构之CObject类
下一篇: MFC架构之CWinThread类
FlowShell
博客等级 码龄17年 119粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值