使用VC ATL实现Office的COM插件(2)

2008-02-23 05:34:37来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

4、注册插件到他的宿主程式:

  打开文档视图FileView—>Resource File中的Addin.rgs文档,加入以下代码:

HKCU
{
 Software
 {
  Microsoft
  {
   Office
   {
    Word
    {
     Addins
     {
      ''WordAddin.Addin''
      {
       val FriendlyName = s ''WORD Custom Addin''
       val Description = s ''Word Custom Addin''
       val LoadBehavior = d ''00000003''
       val CommandLineSafe = d ''00000001''
      }
     }
    }
   }
  }
 }
}

  5、重新编译(build)该工程注册我们的插件。

  6、运行,选择Executable File为word 2000,注意要选择正确的路径,假如运行成功,则插件已加入到word中。

  7、给插件添加菜单和按钮:

  这里简单的介绍一下Office 的命令条:在Office中,菜单栏、工具栏和弹出式菜单都叫做命令条(Command Bar对象)。任何这些种类的命令条中都能够包括其他命令条和不限数量的控件,如相对工具栏这个命令条而言,按钮就是他的控件。有的控件(如菜单)本身又是命令条,能够多级嵌套。任何的命令条可用一个CommandBars集合控制。CommandBars集合是个通用的可共享且可编程的对象,通过他的Add()方法能够为其添加一个CommandBar 对象(即命令条),而每个 CommandBar 对象都有一个CommandBarControls 集合,这个集合里包含了这个命令条里的任何控件。使用 CommandBar 对象的 Controls 属性可引用命令条中的控件。

  现在给word加入一个工具条及其按钮和一个菜单:

  首先在工程中加入office和Word的类型库,在stdafx.h文档中加入以下代码:

#import "C:\Program Files\Microsoft Office\Office\mso9.dll" \
rename_namespace("Office") named_guids
using namespace Office;

#import "C:\Program Files\Microsoft Office\Office\MSOUTL9.olb"
rename_namespace("Word"), raw_interfaces_only, named_guids
using namespace Outlook;

  注意:一定要把路径改为和office的安装路径一致。

  在Word对象模型中,Application对象是代表整个工程的最高级对象,我们能够用他的GetCommandBars方法得到CommandBars对象,由于CommandBars对象是Word任何工具条和菜单项的集合,所以就能够通过调用他的Add方法添加新的工具条。然后为工具条添加新的按钮,其实方法相同简单,我们能够调用CommandBar的GetControls方法得到工具条的CommandBarControls集合,如前所说,CommandBarControls集合是该工具条任何控件的集合,按钮自然是其中之一,那么接下来我们就能够通过调用CommandBarControls集合的Add方法添加一个新的按钮了。下面是具体的实现代码:

CComQIPtr<_Application> spApp(Application);

ATLASSERT(spApp);
m_spApp = spApp;
HRESULT hr = AppEvents::DispEventAdvise(m_spApp);

if(FAILED(hr))
 return hr;

CComPtr <Office::_CommandBars> spCmdBars;
CComPtr <Office::CommandBar> spCmdBar;
hr = m_spApp->get_CommandBars(&spCmdBars);

if(FAILED(hr))
 return hr;

ATLASSERT(spCmdBars);

// now we add a new toolband to Word
// to which we''ll add 2 buttons
CComVariant vName("WordAddin");
CComPtr spNewCmdBar;

// position it below all toolbands
//MsoBarPosition::msoBarTop = 1
CComVariant vPos(1);
CComVariant vTemp(VARIANT_TRUE); // menu is temporary
CComVariant vEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);

//Add a new toolband through Add method
// vMenuTemp holds an unspecified parameter
//spNewCmdBar points to the newly created toolband
spNewCmdBar = spCmdBars->Add(vName, vPos, vEmpty, vTemp);

//now get the toolband''s CommandBarControls
CComPtr < Office::CommandBarControls> spBarControls;
spBarControls = spNewCmdBar->GetControls();
ATLASSERT(spBarControls);

//MsoControlType::msoControlButton = 1
CComVariant vToolBarType(1);

//show the toolbar?
CComVariant vShow(VARIANT_TRUE);
CComPtr <Office::CommandBarControl> spNewBar;
CComPtr <Office::CommandBarControl> spNewBar2;

// add first button
spNewBar = spBarControls->Add(vToolBarType,vEmpty,vEmpty,vEmpty,vShow);
ATLASSERT(spNewBar);

// add 2nd button
spNewBar2 = spBarControls->Add(vToolBarType,vEmpty,vEmpty,vEmpty,vShow);
ATLASSERT(spNewBar2);

_bstr_t bstrNewCaption(OLESTR("Item1"));
_bstr_t bstrTipText(OLESTR("Tooltip for Item1"));

// get CommandBarButton interface for each toolbar button
// so we can specify button styles and stuff
// each button displays a bitmap and caption next to it
CComQIPtr < Office::_CommandBarButton> spCmdButton(spNewBar);
CComQIPtr < Office::_CommandBarButton> spCmdButton2(spNewBar2);

ATLASSERT(spCmdButton);
m_spButton = spCmdButton;
ATLASSERT(spCmdButton2);

// to set a bitmap to a button, load a 32x32 bitmap
// and copy it to clipboard. Call CommandBarButton''s PasteFace()
// to copy the bitmap to the button face. to use
// Word''s set of predefined bitmap, set button''s FaceId to //the
// button whose bitmap you want to use
HBITMAP hBmp =(HBITMAP)::LoadImage(_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDB_BITMAP1),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 对于c/c 中的数组排序及计算平均值和得到最大最小值的思考

下一篇: 使用VC ATL实现Office的COM插件(1)