ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3542|回复: 1

请问如何用VC来控制在word中的事件

[复制链接]

TA的精华主题

TA的得分主题

发表于 2003-10-31 22:46 | 显示全部楼层 |阅读模式
在其他地方我看到过有利用ATL在word中增加工具条和按钮,但对他的事件定义看不,例如:定义一个工具条按钮的响应函数 SINK_ENTRY_INFO(1,__uuidof(Office::_CommandBarButtonEvents),/*dispid*/ 0x01,OnClickButton1, &OnClickButtonInfo) _ATL_FUNC_INFO OnClickButtonInfo = {CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_BOOL}}; 那么这些定义比如OnClickButtonInfo 又是在什么地方命明的呢? 怎么查也查不到,高手高手help me~~~~~~~^_^[em03][em03][em03][em03]

TA的精华主题

TA的得分主题

发表于 2003-12-31 09:00 | 显示全部楼层
1. 新建一个Active Library 2. 新建一个COM Object,在Class Name填一个名字,如Test。 点一下Implemented Interface后面的List按钮。再点一下对话框中的Add Library按钮, 选择“Program Files\Common Files\Designer”目录下的msaddndr.dll文件。 然后在列表中找到msaddndr.dll里面的_IDTExtensibility2接口点击确定。 3. 现在Com AddIn部分已经完成,现在要在Word里面加一个CommandBar和一个按钮,并且让按钮响应事件。 4. 创建一个TcommandBarButton的OleServer类以连接到CommandButton并响应事件。代码:如下 定义部分 TCommandBarButtonClick = procedure(const Ctrl: OleVariant; var CancelDefault: OleVariant) of Object; TCommandBarButton = class(TOleServer) private FIntf: CommandBarButton; FonClick: TCommandBarButtonClick; function GetDefaultInterface: CommandBarButton; procedure SetonClick(const Value: TCommandBarButtonClick); protected procedure InitServerData; override; procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure Connect; override; procedure ConnectTo(svrIntf: CommandBarButton); procedure Disconnect; override; property DefaultInterface: CommandBarButton read GetDefaultInterface; published property onClick : TCommandBarButtonClick read FonClick write SetonClick; end; 实施部分 { TCommandBarButton } procedure TCommandBarButton.Connect; var punk: IUnknown; begin if FIntf = nil then begin punk := GetServer; ConnectEvents(punk); Fintf:= punk as CommandBarButton; end; end; procedure TCommandBarButton.ConnectTo(svrIntf: CommandBarButton); begin Disconnect; FIntf := svrIntf; ConnectEvents(FIntf); end; constructor TCommandBarButton.Create(AOwner: TComponent); begin inherited; end; destructor TCommandBarButton.Destroy; begin inherited; end; procedure TCommandBarButton.Disconnect; begin if Fintf <> nil then begin DisconnectEvents(FIntf); FIntf := nil; end; end; function TCommandBarButton.GetDefaultInterface: CommandBarButton; begin if FIntf = nil then Connect; Assert(FIntf <> nil, 'DefaultInterface is NULL. Component is not connected to Server. You must call ''Connect'' or ''ConnectTo'' before this operation'); Result := FIntf; end; procedure TCommandBarButton.InitServerData; const CServerData: TServerData = ( ClassID: '{55F88891-7708-11D1-ACEB-006008961DA5}'; IntfIID: '{000C030E-0000-0000-C000-000000000046}'; EventIID: '{000C0351-0000-0000-C000-000000000046}'; LicenseKey: nil; Version: 500); begin ServerData := @CServerData; end; procedure TCommandBarButton.InvokeEvent(DispID: TDispID; var Params: TVariantArray); begin case DispID of -1: Exit; // DISPID_UNKNOWN 1: if Assigned(FonClick) then FonClick(Params[0], Params[1]); end; {case DispID} end; procedure TCommandBarButton.SetonClick( const Value: TCommandBarButtonClick); begin FonClick := Value; end; 5. 继续完成Ttest类 在类定义里面增加两项 private FCommandBarButton : TCommandBarButton; procedure FClick(const Ctrl: OleVariant; var CancelDefault: OleVariant); 在OnConnection写下面代码 procedure TTest.OnConnection(const Application: IDispatch; ConnectMode: ext_ConnectMode; const AddInInst: IDispatch; var custom: PSafeArray); //这是从资源中读取一个Bitmap并复制到粘贴板 procedure CopyBitMapToClipBoard; var aStream : TStream; aBitMap : Graphics.TBitmap; begin with TClipboard.Create do begin try aStream := TResourceStream.CreateFromID(HInstance, 1, RT_RCDATA); aBitMap := Graphics.TBitmap.Create; aBitMap.LoadFromStream(aStream); Assign(aBitMap); finally aStream.Free; aBitMap.Free; Free; end; end; end; var App : WordApplication; aCommandBar : CommandBar; aButton : _CommandBarButton; begin App := WordApplication(Application); aCommandBar := App.CommandBars.Add('Test', msoBarTop, False, True); aButton := aCommandBar.Controls.Add(msoControlButton, EmptyParam, EmptyParam, EmptyParam, True) as _CommandBarButton; aButton.Set_Style(msoButtonIconAndCaption); aButton.Set_Caption('Test'); //CopyBitMapToClipBoard; //这两句话是给按钮设定一个外部图标, //aButton.PasteFace; //你要增加一个rcdata的bitmap资源bitmap大小为16*16,具体怎么做请参考其他文档 aButton.Set_Tag('test111'); FCommandBarButton := TCommandBarButton.Create(nil); FCommandBarButton.ConnectTo(aButton); FCommandBarButton.onClick := FClick; aCommandBar.Set_Visible(True); end; 在OnDisconnection写下面代码 procedure TTest.OnDisconnection(RemoveMode: ext_DisconnectMode; var custom: PSafeArray); begin FCommandBarButton.Disconnect; FCommandBarButton.Free; end; 写Click事件(在Word文档中插入当前时间) procedure TTest.FClick(const Ctrl: OleVariant; var CancelDefault: OleVariant); begin Ctrl.Application.Selection.TypeText(DateTimeToStr(Now) + #13#10); end; 6. 最后用菜单->Run->Register Active Server注册Com对象 7. 给Word增加Com AddIn打开RegEdit,增加一个项“HKEY_CURRENT_USER\Software\Microsoft\Office\Word\Addins\AddInTest.Test” 在这个项下面增加一个字符串值“FriendlyName”随便给一个值,如“Test” 再增加一个双字节值“LoadBehavior”把值设为3 你可以借鉴一下,Delphi做的
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-29 19:30 , Processed in 0.017242 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表