使用VC++ ATL开发Office COM插件(三)

本文介绍如何使用COM对象的Idispatch接口实现按钮点击事件。通过IDispEventSimpleImpl<>模板类创建按钮事件响应,并详细展示了如何声明和定义事件回调函数、参数信息结构以及接口映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8、为我刚加入的按钮加入其响应事件:

  ATL为COM对象的Idispatch接口提供了两个模板类: IDispEventImpl<>和IDispEventSimpleImpl<>,选择IDispEventSimpleImpl<>,因为它不需要额 外的类型库信息,从IDispEventSimpleImpl<>继承一个类:

class ATL_NO_VTABLE CAddin :
public CComObjectRootEx < CComSingleThreadModel>,
.....

public IDispEventSimpleImpl<1,CAddin,
&__uuidof(Office::_CommandBarButtonEvents>
  声明按钮点击事件的回调函数:

void __stdcall OnClickButton(Idispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault);
  用_ATL_SINK_INFO结构描述回调的参数信息:打开CAddin.h文件,在其最上加入以下声明:

extern _ATL_FUNC_INFO OnClickButtonInfo;(注意一定声明为外部变量)
  然后打开CAddin.cpp文件为其加入以下定义:

_ATL_FUNC_INFO OnClickButtonInfo ={CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_BOOL}};
  加入按钮点击事件的具体实现:

void __stdcall CAddin::OnClickButton(IDispatch*
/*Office::_CommandBarButton* */ Ctrl,
VARIANT_BOOL * CancelDefault)
{
 USES_CONVERSION;
 CComQIPtr pCommandBarButton(Ctrl);

 //the button that raised the event. Do something with this...
 MessageBox(NULL, "Clicked Button1", "OnClickButton", MB_OK);
}
  在接口映射宏中加入以下信息:

BEGIN_SINK_MAP(CAddin)
SINK_ENTRY_INFO(1, __uuidof(Office::_CommandBarButtonEvents),
/*dispid*/ 0x01,
OnClickButton, &OnClickButtonInfo)
END_SINK_MAP()
  最后在分别在CAddin 类的 OnConnection() 和OnDisconnection()中调用DispEventAdvise() 和 DispEventUnadvise()连接和断开连接消息来源。

  到这里就实现了一个简单的COM插件,运行程序,点击工具栏上新加入的按钮,就可以弹出("Clicked Button1")消息框。

  如果熟悉VBA编程,就可以把编写的宏作为按钮响应事件,只需调用按钮的put_OnAction()方法:

spCmdButton->put_OnAction(OLESTR("YourMacroName"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值