类CCmdTarget

CCmdTarget Class

Microsoft基础类库选件消息映射体系结构的基类。
 

公共构造函数

名称

说明

CCmdTarget::CCmdTarget

构造 CCmdTarget 对象。

公共方法

名称

说明

CCmdTarget::BeginWaitCursor

显示光标作为一个沙漏光标。

CCmdTarget::DoOleVerb

生成OLE谓词指定的事件将执行。

CCmdTarget::EnableAutomation

允许 CCmdTarget 对象的OLE自动化。

CCmdTarget::EnableConnections

启用激发中的操作连接点。

CCmdTarget::EnableTypeLib

启用目标类型库。

CCmdTarget::EndWaitCursor

返回到以前的光标。

CCmdTarget::EnumOleVerbs

枚举对象的OLE谓词。

CCmdTarget::FromIDispatch

返回指向 CCmdTarget 对象与 IDispatch 指针。

CCmdTarget::GetDispatchIID

获取主调度接口ID.

CCmdTarget::GetIDispatch

返回指向 IDispatch 对象与 CCmdTarget 对象。

CCmdTarget::GetTypeInfoCount

检索对象提供类型信息接口的数字。

CCmdTarget::GetTypeInfoOfGuid

检索与指定的 GUID 相对应的类型说明。

CCmdTarget::GetTypeLib

具有指针类型库。

CCmdTarget::GetTypeLibCache

获取该类型库缓存。

CCmdTarget::IsInvokeAllowed

启用自动化方法调用。

CCmdTarget::IsResultExpected

如果自动化功能应返回值,则返回非零。

CCmdTarget::OnCmdMsg

方法与计划排列消息。

CCmdTarget::OnFinalRelease

最后,在OLE引用被释放后,清理。

CCmdTarget::RestoreWaitCursor

还原一个沙漏光标。


消息映射路由命令或对该成员的消息您正常写入处理这些事件。 (命令是从菜单项、命令按钮或快捷键的消息。)

键从 CCmdTarget 派生的结构选件类包括 CView CWinApp CDocument CWnd CFrameWnd如果您在新选件类旨在处理消息,请从一种方式 CCmdTarget派生选件类的派生类。 您从 CCmdTarget 将直接很少派生选件类。

有关路由命令的目标和的 OnCmdMsg 概述,请参见 命令目标 命令传送 将消息映射

CCmdTarget 包括成员函数处理一个沙漏光标的显示。 当您需要一个命令带花费大量的时间间隔执行时,将显示一个沙漏光标。

计划映射,与消息映射,使用显示OLE自动化 IDispatch 功能。 通过公开此接口,其他应用程序(例如Visual Basic)可以对您的应用程序。

 

 类CCmdTarget是MFC类库中消息映射体系的一个基类。消息映射把命令或消息引导给用户为之编写的响应函数(命令是由菜单项、命令按钮或者加速键产生的消息)。从CCmdTarget继承来的按键框架类包括:CView、CWinApp、CDocument、CWnd和CFrameWnd。如果想生成一个处理按键消息的类,可以选择其中的一个派生一个子类。很少需要直接从CCmdTarget派生类

  CCmdTarget类是MFC处理命令消息的基础、核心。MFC为该类设计了许多成员函数和一些成员数据,基本上是为了解决消息映射问题的,而且,很大一部分是针对OLE设计的。在OLE应用中,CCmdTarget是MFC处理模块状态的重要环节,它起到了传递模块状态的作用:其构造函数获取当前模块状态,并保存在成员变量m_pModuleState里头。

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

  类CmdTarget包括了处理沙漏形光标显示的成员函数。当某个命令的执行时间比较长时,可以显示沙漏标提示用户命令正在执行。

  和消息映射类似,分派映射用于列出OLE自动的IDispatch功能。列出这个接口后,其它的应用(如VB)就能调用这个应用了。有关IDispatch接口的更详细的信息,请参阅“Win32 SDK OLE程序员参考”中的“创建IDPatch接口”和“分派接口与API函数”。

  所需头文件:#include <afxwin.h>

  静态成员函数DispatchCmdMsg

  CCmdTarget的静态成员函数DispatchCmdMsg,用来分发Windows消息。此函数是MFC内部使用的,其原型如下:

  static BOOL DispatchCmdMsg(

  CCmdTarget* pTarget,

  UINT nID,

  int nCode,

  AFX_PMSG pfn,

  void* pExtra,

  UINT nSig,

  AFX_CMDHANDLERINFO* pHandlerInfo)

  虚拟函数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默认对象;在新的非默认对象中或在可能要传出命令的命令目标中。

  该类派生于CObject,经封装了MFC的消息映射机制,希望接收系统事件和窗口消息的类都从它派生,如CDocument和CWnd分支。此外,在系统繁忙,无法响应窗口消息时,鼠标光标应该显示为沙漏等待状态,CCmdTarget类封装了3个成员函数完成该功能。封装COM的IDispatch接口是它的另一项主要功能。IDispatch是COM的标准接口,不含指针操作的语言(如VB)以及描述性语言(如Web脚本语言VBA)都通过该接口操作COM组件。CCmdTarget类以一种类似消息映射的机制提供IDispatch接口,所以使用MFC可以轻松地编写AUTOMATION客户程序和组件。

  CCmdTarget类定义BeginWaitCursor()、EndWaitCursor()和RestoreWaitCursor()3个成员函数处理等待光标。BeginWaitCursor()将光标设置为沙漏形状,该函数有可能被程序框架调用,通知用户状态忙,例如当加载和存储文档时。EndWaitCursor()将光标恢复为沙漏之前的形状,一般与BeginWaitCursor()配合使用。

  在实际编程中,在一个比较耗费机时的处理前应该主动调用BeginWaitCursor()设置光标,在处理结束时要调用EndWaitCursor()恢复光标。例如:

  void CWaitCursorDoc::LoadFile(char * Filepath)

  {

  //显示沙漏光标

  BeginWaitCursor();

  //耗费机时的处理过程

  TRACE("正在装入文件,请等待...\n");

  ......

  //恢复为沙漏前的光标形状

  EndWaitCursor();

  }

  如果在BeginWaitCursor()和EndWaitCursor()之间的处理中,弹出了模式对话框,光标会由沙漏变为标准形状(通常是标准箭头)。为处理这种情形,可以在对话框关闭后,调用成员RestoreWaitCursor()重新将光标设置回沙漏形状,直到处理结束后调用EndWait Cursor()。例如:

  void CWaitCursorDoc::LoadFile(char * Filepath)

  {

  WIN32_FIND_DATA FindData;

  //显示沙漏光标

  BeginWaitCursor();

  //耗费机时的处理过程

  if(::FindFirstFile(Filepath,&FindData)==INVALID_HANDLE_VALUE)

  {

  TRACE("打开文件出错,请重新指定文件\n");

  CFileDlg dlg;

  dlg.DoModal();

  //恢复光标的沙漏形状

  RestoreWaitCursor();

  }

  TRACE("正在装入文件,请等待...\n");

  ......

  //恢复沙漏前的光标形状

  EndWaitCursor();

  }

  但如果弹出的是MessageBox()消息框,就不必调用RestoreWaitCursor(),光标会自动恢复为沙漏。

  在非CCmdTarget派生类中,可以使用CWaitCursor类设置等待光标。该类的构造函数和析构函数相当于CCmdTarget::BeginWaitCursor()和CCmdTarget::EndWaitCursor(),成员函数Restore()相当于CCmdTarget:: RestoreWaitCursor()。

CCmdTarget的静态成员函数DispatchCmdMsg,用来分发Windows消息。此函数是MFC内部使用的,其原型如下:

static BOOL DispatchCmdMsg(

CCmdTarget* pTarget,

UINT nID,

int nCode,

AFX_PMSG pfn,

void* pExtra,

UINT nSig,

AFX_CMDHANDLERINFO* pHandlerInfo)

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默认对象;在新的非默认对象中或在可能要传出命令的命令目标中。

该类派生于CObject,经封装了MFC的消息映射机制,希望接收系统事件和窗口消息的类都从它派生,如CDocument和CWnd分支。此外,在系统繁忙,无法响应窗口消息时,鼠标光标应该显示为沙漏等待状态,CCmdTarget类封装了3个成员函数完成该功能。封装COM的IDispatch接口是它的另一项主要功能。IDispatch是COM的标准接口,不含指针操作的语言(如VB)以及描述性语言(如Web脚本语言和VBA)都通过该接口操作COM组件。CCmdTarget类以一种类似消息映射的机制提供IDispatch接口,所以使用MFC可以轻松地编写AUTOMATION客户程序和组件。

CCmdTarget类定义BeginWaitCursor()、EndWaitCursor()和RestoreWaitCursor()3个成员函数处理等待光标。BeginWaitCursor()将光标设置为沙漏形状,该函数有可能被程序框架调用,通知用户状态忙,例如当加载和存储文档时。EndWaitCursor()将光标恢复为沙漏之前的形状,一般与BeginWaitCursor()配合使用。

在实际编程中,在一个比较耗费机时的处理前应该主动调用BeginWaitCursor()设置光标,在处理结束时要调用EndWaitCursor()恢复光标。

例如:

void CWaitCursorDoc::LoadFile(char * Filepath)

{

//显示沙漏光标

BeginWaitCursor();

//耗费机时的处理过程

TRACE("正在装入文件,请等待...\n");

......

//恢复为沙漏前的光标形状

EndWaitCursor();

}

如果在BeginWaitCursor()和EndWaitCursor()之间的处理中,弹出了模式对话框,光标会由沙漏变为标准形状(通常是标准箭头)。为处理这种情形,可以在对话框关闭后,调用成员RestoreWaitCursor()重新将光标设置回沙漏形状,直到处理结束后调用EndWait Cursor()。例如:

void CWaitCursorDoc::LoadFile(char * Filepath)

{

WIN32_FIND_DATA FindData;

//显示沙漏光标

BeginWaitCursor();

//耗费机时的处理过程

if(::FindFirstFile(Filepath,&FindData)==INVALID_HANDLE_VALUE)

{

TRACE("打开文件出错,请重新指定文件\n");

CFileDlg dlg;

dlg.DoModal();

//恢复光标的沙漏形状

RestoreWaitCursor();

}

TRACE("正在装入文件,请等待...\n");

......

//恢复沙漏前的光标形状

EndWaitCursor();

}

但如果弹出的是MessageBox()消息框,就不必调用RestoreWaitCursor(),光标会自动恢复为沙漏。

在非CCmdTarget派生类中,可以使用CWaitCursor类设置等待光标。该类的构造函数和析构函数相当于CCmdTarget::BeginWaitCursor()和CCmdTarget::EndWaitCursor(),成员函数Restore()相当于CCmdTarget:: RestoreWaitCursor()。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值