设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2224|回复: 0
打印 上一主题 下一主题

Office2000下内部COM插件的编程实现(之二)

[复制链接]
跳转到指定楼层
1#
发表于 2005-12-4 20:48:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在Office应用程序中,尽管菜单和工具栏按钮看上去不太一样,但实质上它们是相同类型的对象。CommandBars集合包含程序中的所有命令条,如:工具条和菜单条。每一个CommandBars集合都有一个CommandBar对象和它对应,CommandBar 对象可以包含其它的 CommandBar 对象,这些对象是作为按钮或菜单命令来用的。每一个CommandBar都将通过CommandBarControls 对象被引用,CommandBarControls又可以包含一组CommandBarControl对象。每一个CommandBarControl可以包含一个CommandBar对象,并可以通过它来存取控件属性。每一个CommandBarControl对象,实际是对应CommandBarControls中的控件集合。CommandBarControl可以有三种表现形式:


l         弹出式(CommandBarPopup):相当于菜单条的一个菜单项。


l         组合框(CommandBarComboBox):类似于工具条中组合框控件。它包括一个工具栏和紧接着工具栏的一个下拉箭头。单击该按钮,将显示出更多的带图标的菜单命令。


l         按钮(CommandBarButton)相当于标准的工具栏按钮,即带有图标的按钮。





在下面的示例程序中,我们将在Outlook2K中新建一个工具条并在其上添加二个按钮,并且在其菜单“工具”中新建一个菜单条,这些操作都可以在OnConnection接口涵数中完成。


首先,我们需要在工程中导入Office和Outlook类型库,可以在Stdafx.h文件中加入下面语句(注意:其中路径可根据Office所装路径自行设定):


// 导入工程所需Office2K及Outlook2K类型库


#import "erogram FilesMicrosoft OfficeOfficemso9.dll" rename_namespace("Office"), named_guids


using namespace Office;





#import "erogram FilesMicrosoft OfficeOfficeMSOUTL9.olb" rename_namespace("Outlook"), raw_interfaces_only, named_guids


using namespace Outlook;





其次,让我们来在Outlook中新建一个工具条,并且在其上添加两个按钮。


代码如下:


// 装??插件时处理


    STDMETHOD(OnConnection)(IDispatch * Application, ext_ConnectMode ConnectMode, IDispatch * AddInInst, SAFEARRAY * * custom)


    {


        CComPtr < Office::_CommandBars> spCmdBars;


        


        // Outlook应用接口_Application


        CComQIPtr <Outlook::_Application> spApp(Application);


        ATLASSERT(spApp);





        // 获取CommandBars接口


        CComPtr<Outlook::_Explorer> spExplorer;     


        spApp->ActiveExplorer(&spExplorer);


        HRESULT hr = spExplorer->get_CommandBars(&spCmdBars);


        if(FAILED(hr))


            return hr;


        ATLASSERT(spCmdBars);





        // 新增一个工具条及其上两个位图按钮


        CComVariant vName("新增Outlook2K工具条插件");


        CComPtr <Office::CommandBar> spNewCmdBar;


        


        // 新增工具条位置


        CComVariant vPos(1);


        


        CComVariant vTemp(VARIANT_TRUE); // 临时        


        CComVariant vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);         


        // 用Add方法在指定位置新增一工具条并让spNewCmdBar指向它


        spNewCmdBar = spCmdBars->Add(vName, vPos, vEmpty, vTemp);


        


        // 获取新增工具条的CommandBarControls,从而在其上添加按钮


        CComPtr < Office::CommandBarControls> spBarControls;


        spBarControls = spNewCmdBar->GetControls();


        ATLASSERT(spBarControls);


        


        //MsoControlType::msoControlButton = 1<
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-2 21:30 , Processed in 0.083122 second(s), 24 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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