Office中国论坛/Access中国论坛

标题: Office2000下内部COM插件的编程实现(之二) [打印本页]

作者: sophieqd    时间: 2005-12-4 20:48
标题: Office2000下内部COM插件的编程实现(之二)
在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<




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3