相当于标准的工具栏按钮,即带有图标的按钮。
在下面的示例程序中,我们将在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; …… 接着
【我对这篇文章有话说?】