office 插件

fangchao918628 2010-09-02 10:43:37
参照网上的一个代码(基本COPY)弄的个,在WORD中添加菜单的插件...
现在有个问题是每次运行一次word就增加一个菜单项....,看了半天不知道啥原因..

_bstr_t bstrNewMenuText(OLESTR("新增菜单条"));
CComPtr < Office::CommandBarControls> spCmdCtrls;
CComPtr < Office::CommandBarControls> spCmdBarCtrls;
CComPtr < Office::CommandBarPopup> spCmdPopup;
CComPtr < Office::CommandBarControl> spCmdCtrl;

CComPtr < Office::CommandBar> spCmdBar;

hr = spCmdBars->get_ActiveMenuBar(&spCmdBar);
if (FAILED(hr))
return hr;

spCmdCtrls = spCmdBar->GetControls();
ATLASSERT(spCmdCtrls);

CComVariant vItem(5);
spCmdCtrl= spCmdCtrls->GetItem(vItem);
ATLASSERT(spCmdCtrl);

IDispatchPtr spDisp;
spDisp = spCmdCtrl->GetControl();

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方法创建新的菜单条 spCmdCtrls spCmdBarCtrls
spNewMenu = spCmdCtrls->Add(vMenuType, vMenuEmpty, vMenuEmpty, vMenuEmpty, vMenuTemp);
ATLASSERT(spNewMenu);

spNewMenu->PutCaption(bstrNewMenuText);
spNewMenu->PutEnabled(VARIANT_TRUE);
spNewMenu->PutVisible(VARIANT_TRUE);



CComQIPtr < Office::_CommandBarButton> spCmdMenuButton(spNewMenu);
ATLASSERT(spCmdMenuButton);
spCmdMenuButton->PutStyle(Office::msoButtonIconAndCaption);

// 同新增工具条第一个按钮位图相同方法
spCmdMenuButton->PasteFace();

// 显示菜单
spNewMenu->PutVisible(VARIANT_TRUE);

m_spMenu = spCmdMenuButton;

哪位大虾推荐本书看下...
网上找了下,很多书不是绝版就是没货(com本质论,深入解析ATl等....)
...全文
205 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
fangchao918628 2010-09-03
  • 打赏
  • 举报
回复
谢谢,浆糊老大,按照你的方法,搞定了....
yuchongjike 2010-09-02
  • 打赏
  • 举报
回复
在创建之前加入判断,如果这个菜单项存在,就返回,不存在就创建
qiuxin425 2010-09-02
  • 打赏
  • 举报
回复
不是很懂,帮你顶一下
jameshooo 2010-09-02
  • 打赏
  • 举报
回复
OFFICE有缓存机制,不需要每次加载插件都重新创建工具栏(在OFFICE中菜单栏和工具栏本质上是相同的)。
创建COMMANDBARCONTROLS时通常指定一个名称,下次先寻找名称,没有才创建。弹出菜单例外。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧