TN071:MFC IOleCommandTarget 实现

备注

以下技术声明,则它在联机文档,首先包括了不更新。因此,某些过程和主题可能已过时或不正确。有关最新信息,建议您搜索议题在联机文档的索引。

IOleCommandTarget 接口允许对象,它们的对时间表的容器之间的顺序。 例如,对象的工具栏可以包含命令的按钮例如 打印打印预览保存、 New和 缩放。 如果此类对象在支持 IOleCommandTarget的容器嵌入的对象,可以使其按钮和前进命令到进程的用户何时容器单击它们。 如果容器希望该嵌入对象打印自己,则可以通过发送命令使此请求将嵌入对象的 IOleCommandTarget 接口。

IOleCommandTarget 是一个类似于自动化的接口因为客户端使用该方法调用服务器上的方法。 但是,在中,因为程序员不必使用 IDispatch,通常很大的 Invoke 方法使用 IOleCommandTarget 保存开销使通过自动化接口调用。

在 MFC 中,激活使用 IOleCommandTarget 接口文档服务器允许活动文档容器计划命令到服务器。 活动文档服务器类, CDocObjectServerItem,使用 MFC 接口映射 (请参见 TN038:MFC/OLE IUnknown 实现) 实现 IOleCommandTarget 接口。

IOleCommandTargetCOleFrameHook 类还实现。 COleFrameHook 是实现就地编辑容器的框架窗口功能的未记录的 MFC 类。 COleFrameHook 还使用 MFC 接口映射 IOleCommandTarget 实现接口。 向前 IOleCommandTarget OLE 命令的 COleFrameHook 的实现。 COleDocObjectItem的派生活动文档容器。 这允许任何 MFC 活动文档容器接收来自包含活动的消息文档服务器。

MFC OLE 命令映射

通过使用 MFC 的 OLE 命令映射, MFC 开发人员可以利用 IOleCommandTarget 。 OLE 命令映射与消息映射,因为它们可用于映射 OLE 命令到包含命令映射类的成员函数。 进行此工作、地点宏在命令映射指定要处理命令的 OLE 命令组, OLE 命令以及要发送的命令 ID WM_COMMAND 信息,当该 OLE 命令接收。 MFC 提供标准 OLE 命令还提供了许多预定义的宏。 有关最初旨在用于 Microsoft Office 应用程序使用标准 OLE 命令的列表,请参见 OLECMDID 枚举,在 docobj.h 定义。

当一个 OLE 命令以包含 OLE 命令映射的 MFC 应用程序时收到, MFC 尝试找到命令 ID 和命令组请求的命令在应用程序的 OLE 命令映射。 如果找到匹配项, WM_COMMAND 消息调度到包含随请求的命令 ID 的应用程序命令映射。 (请参见下面 ON_OLECMD 的说明。)这样, OLE 命令的请求调度到应用程序转换为 WM_COMMAND 消息由 MFC。 使用 MFC 标准 命令传送 体系结构, WM_COMMAND 消息传递应用程序的消息映射然后将。

不同消息映射, MFC OLE 命令映射中未由类向导支持。 MFC 开发人员必须将 OLE 命令映射手动备份和 OLE 命令映射项。 OLE 命令映射可添加到 MFC 活动文档在 WM_COMMAND 消息路由链激活时文档是在容器的就地活动状态的任何类的服务器。 这些类包括从 CWinAppCViewCDocumentCOleIPFrameWnd派生的应用程序的类。 在活动文档容器, OLE 命令映射只能添加到 COleDocObjectItem派生类。 此外,在活动文档容器, WM_COMMAND 消息仅调度到 COleDocObjectItem的消息映射派生类。

OLE 命令映射宏

使用下面的宏命令映射函数添加到类:

DECLARE_OLECMD_MAP ()

此宏在类声明中 (通常是在头文件包含命令映射) 的类。

BEGIN_OLECMD_MAP(theClass, baseClass)
  • theClass
    包含命令映射类的名称。

  • baseClass
    类的基类的名称包含命令映射。

此宏指示命令映射的开头。 使用此宏实现文件中为包含命令映射的类。

END_OLECMD_MAP()

此宏指示命令映射的结尾。 使用此宏实现文件中为包含命令映射的类。 此宏必须始终按照 BEGIN_OLECMD_MAP 宏。

ON_OLECMD(pguid, olecmdid, id)
  • pguid
    对 OLE 命令的命令组 GUID 的指针。 此参数是标准 OLE 命令组的 NULL

  • olecmdid
    命令的 OLE 命令 ID 调用。

  • id
    要发送的 WM_COMMAND 消息的 ID 到包含命令映射的应用程序,当此 OLE 命令调用。

使用 ON_OLECMD 宏在命令映射添加要处理的 OLE 命令的项。 当 OLE 命令接收,使用标准 MFC 命令传送体系结构,它们将转换为指定的 WM_COMMAND 消息并通过应用程序的消息映射路由。

示例

下面的示例演示如何将命令处理功能的 OLE 到 MFC 活动文档服务器处理 OLECMDID_PRINT OLE 命令。 此示例假定,请使用 AppWizard 生成是活动文档服务器的 MFC 应用程序。

  1. 在您的 CView派生类的头文件,添加 DECLARE_OLECMD_MAP 宏到类声明。

    备注

    使用 CView派生类,因为它是某个激活的类文档。 WM_COMMAND 消息路由链的服务器。

    class CMyServerView : public CView
    {
    protected: // create from serialization only
       CMyServerView();
       DECLARE_DYNCREATE(CMyServerView)
       DECLARE_OLECMD_MAP()
    . . .
    };
    
  2. CView实现文件的派生类,添加 BEGIN_OLECMD_MAP 和 END_OLECMD_MAP 宏:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
    
    END_OLECMD_MAP()
    
  3. 处理标准 OLE 打印 " 命令,添加一 ON_OLECMD 宏来指定 OLE 命令 ID 为标准的打印和 ID_FILE_PRINT 的命令映射。 WM_COMMAND ID. ID_FILE_PRINT 是 AppWizard 生成的 MFC 应用程序使用的标准 " 打印 " 命令 ID:

    BEGIN_OLECMD_MAP(CMyServerView, CView)
       ON_OLECMD(NULL,OLECMDID_PRINT,ID_FILE_PRINT)
    END_OLECMD_MAP()
    

,因为 OLECMDID_PRINT 是标准 OLE 命令 ID.,请注意,标准 OLE 命令宏,定义在 afxdocob.h,可以在 ON_OLECMD 宏位置使用 ON_OLECMD_PRINT 宏将完成任务和显示的 ON_OLECMD 宏相同的上面。

当容器应用程序通过服务器的 IOleCommandTarget 接口发送此服务器一个 OLECMDID_PRINT 命令, MFC 打印 " 命令处理程序在服务器将调用,这会导致服务器打印应用程序。 活动文档容器的代码调用步骤中添加的打印 " 命令上述内容相仿:

void CContainerCntrItem::DoOleCmd()
{
   IOleCommandTarget *pCmd = NULL;
   HRESULT hr = E_FAIL;
   OLECMD ocm={OLECMDID_PRINT, 0};

   hr = m_lpObject->QueryInterface(IID_IOleCommandTarget,reinterpret_cast<void**>(&pCmd));
   if(FAILED(hr))
      return;

   hr = pCmd->QueryStatus(NULL, 1, &ocm, NULL);
   if(SUCCEEDED(hr) && (ocm.cmdf & OLECMDF_ENABLED))
   {
      //Command is available and enabled so call it
      COleVariant vIn;
      COleVariant vOut;
      hr = pCmd->Exec(NULL, OLECMDID_PRINT,
 OLECMDEXECOPT_DODEFAULT, &vIn, &vOut);
      ASSERT(SUCCEEDED(hr));
   }
   pCmd->Release();
}

请参见

其他资源

由Number "技术说明

技术说明按类别