65.9K
CodeProject 正在变化。 阅读更多。
Home

Microsoft Outlook 加载项教程 - 2:向按钮添加事件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.20/5 (12投票s)

2004年5月24日

3分钟阅读

viewsIcon

106702

downloadIcon

885

这将在第一个教程中添加一个事件处理程序到按钮。

引言

为在之前教程中创建的按钮添加事件处理程序

在之前的教程中,我们已经看到了如何添加工具栏,从而在 Microsoft Outlook 中创建一个按钮。 现在,在本教程中,我们将看到如何为按钮调用一个事件处理程序,或者用 COM 的术语来说,如何通知按钮事件!

本教程背后的想法很简单,当点击创建的按钮时,我们需要显示一个消息框,上面写着“按钮已点击”。 为此,我们必须捕获按钮点击事件,即 CommandBar 事件。 负责此事的 disp 接口是 _CommandBarButtonEvents。 因此,现在,如果我们实现这个接收器接口,它将被事件源调用,那么我们的工作就完成了。

IDispEventSimpleImpl<>

所以,在这里我们必须用简单的话在我们的按钮和接口之间创建一个连接点。IDispEventSimpleImpl<> 接口为 ATL COM 对象提供了连接点。 它也用于实现事件 dispinterface。 现在,我们必须从这个接口派生我们的类。 这样做如下

class ATL_NO_VTABLE CAddin : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CAddin, &CLSID_Addin>,
    public IDispatchImpl<IAddin, &IID_IAddin, &LIBID_OUTLOOKADDINLib>,
    public IDispatchImpl<_IDTExtensibility2, 
        &IID__IDTExtensibility2, &LIBID_AddInDesignerObjects>,
    //the derivation is done here
    public IDispEventSimpleImpl<1,CAddin, 
        &__uuidof(Office::_CommandBarButtonEvents)> 
Parameters:
  1. 第一个参数是源对象的唯一标识符。
  2. 第二个参数是用户类,所以这里我们有 CAddin
  3. 第三个参数是指向该类事件 dispinterface 的 IID 的指针。
  4. 这里我们的 dispinterface 是 Office::_CommandBarButtonEvents。 如需帮助,请参考 Microsoft Outlook 对象模型。

一个简单的捷径

现在,我们做一个简单的捷径来让我们的工作更容易。 我们在文件中的构造函数之前添加此代码

public:
//the added code is here
 typedef IDispEventSimpleImpl</*nID =*/ 1, 
    CAddin, &__uuidof(Office::_CommandBarButtonEvents)> CommandButton1Events;
 CAddin()
 {
 }

正如我们所看到的,这可以帮助通知我们的接收器,因为我们在这里做了 typedef。 如果您在这里感到困惑,请随时进行下一步。

接收器条目

为了处理接收器,我们需要为我们的事件通知提供条目,以便它们由它们适当的函数处理,就像我们在 MFC 和 Win32 中的消息一样。

所以,我们需要在 END_COM_MAP() 宏之后输入 SINK ENTRY,如下所示。

BEGIN_SINK_MAP(CAddin)
SINK_ENTRY_INFO(1, __uuidof(Office::_CommandBarButtonEvents),0x01, 
                               OnClickButton, &OnClickButtonInfo)
END_SINK_MAP() 
in SINK_ENTRY_INFO

我们指定了我们的唯一标识符、标识 dispatch 接口的 IID、标识指定事件的 dispid、事件处理程序函数的名称,以及最后一个参数对应于类型信息。 这是以 ATL_FUNC_INFO 结构的形式提供的。 我们在 Addin.cpp 文件中这样做。

_ATL_FUNC_INFO OnClickButtonInfo = 
  {CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_BOOL}}; 

设置我们的 CallBack

  1. 我们定义我们的回调如下
    void __stdcall 
          OnClickButton(IDispatch * /*Office::_CommandBarButton**/ Ctrl, 
          VARIANT_BOOL * CancelDefault); 
  2. 接下来是我们的 OnClickButton 函数的声明,它被添加到 Addin.h 的顶部。
    extern _ATL_FUNC_INFO OnClickButtonInfo;
  3. 下一步也是最后一步是编写我们的函数! 所以,这是函数,在 Addin.cpp 中。
    void __stdcall CAddin::OnClickButton(IDispatch* Ctrl, 
                                    VARIANT_BOOL * CancelDefault)
    {
        MessageBox(NULL, "U Have Clicked Me, 
                                Friend", "OnClickButton", MB_OK);
    }

就这样了……我们完成了关于按下按钮时获得消息框的第二个教程……嗯……看起来很简单,而且确实如此。

由于这是我编写教程的第一步,请随时将您的评论发送至 chakkaradeepcc@yahoo.com

致谢

  1. 本教程基于 Amit Dey 在他的教程《使用 VC++/ATL 构建 Office2K COM 插件》中的想法。

    因此,我所有的感谢都献给 Amit Dey 先生,他是我插件的“大师”。

  2. 并且,我提到了 Microsoft 公司的 Igor Tandek,感谢他在让我了解插件以及 ATL COM 的内在概念方面给予的巨大帮助。

一个小请求给 Amit Dey……任何联系电话、地址或邮件 ID?

© . All rights reserved.