WEB开发网
开发学院软件开发VC Office2000下内部COM插件的编程实现 阅读

Office2000下内部COM插件的编程实现

 2006-07-21 11:45:48 来源:WEB开发网   
核心提示: 在下面的示例程序中,我们将在Outlook2K中新建一个工具条并在其上添加二个按钮,Office2000下内部COM插件的编程实现(5),并且在其菜单“工具”中新建一个菜单条,这些操作都可以在OnConnection接口函数中完成,就可以看到如图一所示的界面效果了,

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

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

// 导入工程所需Office2K及Outlook2K类型库
#import "e:\Program Files\Microsoft Office\Office\mso9.dll" rename_namespace("Office"), named_guids
using namespace Office;
#import "e:\Program Files\Microsoft Office\Office\MSOUTL9.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
    CComVariant vToolBarType(1);
    //显示工具条
    CComVariant vShow(VARIANT_TRUE);
    
    CComPtr < Office::CommandBarControl> spNewBar;
    CComPtr < Office::CommandBarControl> spNewBar2;
    
    // 用CommandBarControls中的Add方法新增第一个按钮,并让spNewBar指向它
    spNewBar = spBarControls->Add(vToolBarType, vEmpty, vEmpty, vEmpty, vShow);
    ATLASSERT(spNewBar);
    // 用CommandBarControls中的Add方法新增第二个按钮,并让spNewBar2指向它
    spNewBar2 = spBarControls->Add(vToolBarType, vEmpty, vEmpty, vEmpty, vShow);
    ATLASSERT(spNewBar2);
    
    // 为每一个按钮指定_CommandBarButton接口,从面可以指定按钮的显示风格等
    CComQIPtr < Office::_CommandBarButton> spCmdButton(spNewBar);
    CComQIPtr < Office::_CommandBarButton> spCmdButton2(spNewBar2);
    
    ATLASSERT(spCmdButton);
    ATLASSERT(spCmdButton2);
    
    // 设置位图按钮风格,位图为32x32大小,将其放入剪切板中用PasteFace()贴在指定按钮上
    HBITMAP hBmp =(HBITMAP)::LoadImage(_Module.GetResourceInstance(),
      MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
    
    ::OpenClipboard(NULL);
    ::EmptyClipboard();
    ::SetClipboardData(CF_BITMAP, (HANDLE)hBmp);
    ::CloseClipboard();
    ::DeleteObject(hBmp);    
    // 粘贴前设置显示风格
    spCmdButton->PutStyle(Office::msoButtonIconAndCaption);
    
    hr = spCmdButton->PasteFace();
    if (FAILED(hr))
      return hr;
    
    spCmdButton->PutVisible(VARIANT_TRUE);
    spCmdButton->PutCaption(OLESTR("按钮1"));
    spCmdButton->PutEnabled(VARIANT_TRUE);
    spCmdButton->PutTooltipText(OLESTR("按钮1提示信息"));
    spCmdButton->PutTag(OLESTR("按钮1标志"));
    
    // 显示新增工具条
    spNewCmdBar->PutVisible(VARIANT_TRUE);
    
    // 设置第二个工具条按钮风格
    spCmdButton2->PutStyle(Office::msoButtonIconAndCaption);
    
    // 第二个按钮指定位图为Outlook2K中预先定义的位图
    spCmdButton2->PutFaceId(1760); 
    
    spCmdButton2->PutVisible(VARIANT_TRUE);
    spCmdButton2->PutCaption(OLESTR("按钮2"));
    spCmdButton2->PutEnabled(VARIANT_TRUE);
    spCmdButton2->PutTooltipText(OLESTR("按钮2提示信息"));
    spCmdButton2->PutTag(OLESTR("按钮2标志"));
    spCmdButton2->PutVisible(VARIANT_TRUE);
    
    m_spButton = spCmdButton;
    m_spButton2 = spCmdButton2;
    ……
接着,让我们在菜单"工具"中新建一个菜单条。 代码如下: _bstr_t bstrNewMenuText(OLESTR("新增菜单条"));
CComPtr < Office::CommandBarControls> spCmdCtrls;
CComPtr < Office::CommandBarControls> spCmdBarCtrls;
CComPtr < Office::CommandBarPopup> spCmdPopup;
CComPtr < Office::CommandBarControl> spCmdCtrl;
    
CComPtr < Office::CommandBar> spCmdBar;
// 通过CommandBar获取Outlook主菜单
hr = spCmdBars->get_ActiveMenuBar(&spCmdBar);
if (FAILED(hr))
  return hr;
// 获取菜单条的CommandBarControls
spCmdCtrls = spCmdBar->GetControls();
ATLASSERT(spCmdCtrls);
    
// 在第5个"工具"菜单下新增一菜单条
CComVariant vItem(5);
spCmdCtrl= spCmdCtrls->GetItem(vItem);
ATLASSERT(spCmdCtrl);
    
IDispatchPtr spDisp;
spDisp = spCmdCtrl->GetControl();
    
// 获取菜单条CommandBarPopup接口
CComQIPtr < Office::CommandBarPopup> ppCmdPopup(spDisp); 
ATLASSERT(ppCmdPopup);
    
spCmdBarCtrls = ppCmdPopup->GetControls();
ATLASSERT(spCmdBarCtrls);
    
CComVariant vMenuType(1); // 控件类型 - menu
CComVariant vMenuPos(6); 
CComVariant vMenuEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
CComVariant vMenuShow(VARIANT_TRUE); // 菜单将显示
CComVariant vMenuTemp(VARIANT_TRUE); // 临时    
    
    
CComPtr < Office::CommandBarControl> spNewMenu;
// 用Add方法创建新的菜单条
spNewMenu = spCmdBarCtrls->Add(vMenuType,
        vMenuEmpty,
        vMenuEmpty,
        vMenuEmpty,
        vMenuTemp);
ATLASSERT(spNewMenu);
    
spNewMenu->PutCaption(bstrNewMenuText);
spNewMenu->PutEnabled(VARIANT_TRUE);
spNewMenu->PutVisible(VARIANT_TRUE);
    
// 利用CommandBarButton来在菜单条前显示位图
CComQIPtr < Office::_CommandBarButton> spCmdMenuButton(spNewMenu);
ATLASSERT(spCmdMenuButton);
spCmdMenuButton->PutStyle(Office::msoButtonIconAndCaption);
    
// 同新增工具条第一个按钮位图相同方法
spCmdMenuButton->PasteFace();
// 显示菜单  
spNewMenu->PutVisible(VARIANT_TRUE);
m_spMenu = spCmdMenuButton;
这样,通过在Outlook中通过上面提到的方法加载COM插件,就可以看到如图一所示的界面效果了,但是点击时没有响应,最后就让我们来解决这个问题。

上一页  1 2 3 4 5 6  下一页

Tags:Office 内部 COM

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接