怎么通过com向word添加图片?

霜哀 2018-07-25 11:30:43
我有组件的代码,就是在word上加个工具栏,有个按钮点击打开网页,想改成点击向word插入图片,网上找了些方法但是各种报错=-=要怎么改啊,小白一个最好说详细点=-=对了我用的是vs2008
#ifndef __WORD2000ADDIN_H_
#define __WORD2000ADDIN_H_

#include "resource.h" // main symbols
#import "F:\\offic200\\PFILES\COMMON\\DESIGNER\\MSADDNDR.DLL" raw_interfaces_only, raw_native_types, no_namespace, named_guids

// 按钮事件响应信息定义
extern _ATL_FUNC_INFO OnClickButtonInfo;
/////////////////////////////////////////////////////////////////////////////
// CWord2000Addin
class ATL_NO_VTABLE CWord2000Addin :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CWord2000Addin, &CLSID_Word2000Addin>,
public IDispatchImpl<IWord2000Addin, &IID_IWord2000Addin, &LIBID_WORDADDINLib>,
public IDispatchImpl<_IDTExtensibility2, &IID__IDTExtensibility2, &LIBID_AddInDesignerObjects>,
public IDispEventSimpleImpl<1,CWord2000Addin,&__uuidof(Office::_CommandBarButtonEvents)>
{
public:
typedef IDispEventSimpleImpl</*nID =*/ 1,CWord2000Addin, &__uuidof(Office::_CommandBarButtonEvents)> CommandButton1Events;

CWord2000Addin()
{
// 初始值
m_spApp = NULL;
m_spButton = NULL;
}

DECLARE_REGISTRY_RESOURCEID(IDR_WORD2000ADDIN)

DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CWord2000Addin)
COM_INTERFACE_ENTRY(IWord2000Addin)
//DEL COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY2(IDispatch, IWord2000Addin)
COM_INTERFACE_ENTRY(_IDTExtensibility2)
END_COM_MAP()

BEGIN_SINK_MAP(CWord2000Addin)
SINK_ENTRY_INFO(1,__uuidof(Office::_CommandBarButtonEvents),/*dispid*/ 0x01,OnClickButton1, &OnClickButtonInfo)
END_SINK_MAP()

// IWord2000Addin
public:
void __stdcall OnClickButton1(IDispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault);


// _IDTExtensibility2
// 装缷插件时处理
STDMETHOD(OnConnection)(IDispatch * Application, ext_ConnectMode ConnectMode, IDispatch * AddInInst, SAFEARRAY * * custom)
{
CComPtr < Office::_CommandBars> spCmdBars;

// Word应用接口_Application
CComQIPtr<MSWord::_Application> spApp(Application);
ATLASSERT(spApp);

// 获取CommandBars接口
HRESULT hr = spApp->get_CommandBars(&spCmdBars);
if(FAILED(hr))
return hr;
ATLASSERT(spCmdBars);

// 新增一个工具条及其上一个位图按钮
CComVariant vName("新增Word2000工具条插件");
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;

// 用CommandBarControls中的Add方法新增第一个按钮,并让spNewBar指向它
spNewBar = spBarControls->Add(vToolBarType, vEmpty, vEmpty, vEmpty, vShow);
ATLASSERT(spNewBar);

// 为每一个按钮指定_CommandBarButton接口,从面可以指定按钮的显示风格等
CComQIPtr < Office::_CommandBarButton> spCmdButton(spNewBar);
ATLASSERT(spCmdButton);

// 设置位图按钮风格,位图为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);

m_spButton = spCmdButton;

// 激活新增的工具条按钮的事件连接点
m_spApp = spApp;
hr = CommandButton1Events::DispEventAdvise((IDispatch*)m_spButton);
if(FAILED(hr))
return hr;

::EmptyClipboard();

return S_OK;
}

// 缷载插件时处理
STDMETHOD(OnDisconnection)(ext_DisconnectMode RemoveMode, SAFEARRAY * * custom)
{

// 断开新增的工具条按钮的事件连接点
HRESULT hr = CommandButton1Events::DispEventUnadvise((IDispatch*)m_spButton);
if(FAILED(hr))
return hr;

m_spButton = NULL;
m_spApp = NULL;

return S_OK;
}

STDMETHOD(OnAddInsUpdate)(SAFEARRAY * * custom)
{
return E_NOTIMPL;
}

STDMETHOD(OnStartupComplete)(SAFEARRAY * * custom)
{
return E_NOTIMPL;
}

STDMETHOD(OnBeginShutdown)(SAFEARRAY * * custom)
{
return E_NOTIMPL;
}

private:
CComPtr<Office::_CommandBarButton> m_spButton; // 新建工具条按钮1

CComPtr<MSWord::_Application> m_spApp;
};

#endif //__WORD2000ADDIN_H




#include "stdafx.h"
#include "WordAddin.h"
#include "Word2000Addin.h"
//#include <afxdisp.h>
/////////////////////////////////////////////////////////////////////////////
// CWord2000Addin

// 按钮事件响应信息定义
_ATL_FUNC_INFO OnClickButtonInfo = {CC_STDCALL,VT_EMPTY,2,{VT_DISPATCH,VT_BYREF | VT_BOOL}};

// 工具条按钮1点击事件响应涵数
void __stdcall CWord2000Addin::OnClickButton1(IDispatch* /*Office::_CommandBarButton* */ Ctrl,VARIANT_BOOL * CancelDefault)
{
//USES_CONVERSION;
//CComQIPtr<Office::_CommandBarButton> pCommandBarButton(Ctrl);

//HINSTANCE result=ShellExecute(NULL, _T("open"), _T("http://www.vckbase.com"), NULL,NULL, SW_SHOW);

Selection sel=m_spApp->GetSelection();//获取文档的selection
InlineShapes inlineshapes = sel.GetInlineShapes();
inlineshapes.AddPicture("E://3.jpg",COleVariant((short)FALSE),COleVariant((short)TRUE),&_variant_t(sel.GetRange()));//添加图片,并制定其位置为当前光标位置
inlineshapes.ReleaseDispatch();
sel.ReleaseDispatch();
}
错误 7 error C2259: “MSWord::Selection”: 不能实例化抽象类 c:\users\zj\desktop\900624wordaddin\wordaddin\word2000addin.cpp 33 WordAddin
错误 8 error C2259: “MSWord::InlineShapes”: 不能实例化抽象类 c:\users\zj\desktop\900624wordaddin\wordaddin\word2000addin.cpp 34 WordAddin
错误 9 error C3861: “COleVariant”: 找不到标识符 c:\users\zj\desktop\900624wordaddin\wordaddin\word2000addin.cpp 35 WordAddin
错误 10 error C3861: “COleVariant”: 找不到标识符 c:\users\zj\desktop\900624wordaddin\wordaddin\word2000addin.cpp 35 WordAddin
错误 11 error C2039: “ReleaseDispatch”: 不是“MSWord::InlineShapes”的成员 c:\users\zj\desktop\900624wordaddin\wordaddin\word2000addin.cpp 36 WordAddin
错误 12 error C2039: “ReleaseDispatch”: 不是“MSWord::Selection”的成员 c:\users\zj\desktop\900624wordaddin\wordaddin\word2000addin.cpp 37 WordAddin
...全文
124 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-07-26
  • 打赏
  • 举报
回复
在Word中开始记录宏,手动完成所需功能,结束记录宏,按Alt+F11键,查看刚才记录的宏对应的VBA代码。
赵4老师 2018-07-26
  • 打赏
  • 举报
回复
帮结帖+散分
霜哀 2018-07-26
  • 打赏
  • 举报
回复
自己搞好了=-=
SelectionPtr sel=m_spApp->GetSelection();//获取文档的selection
InlineShapesPtr inlineshapes = sel->GetInlineShapes();
inlineshapes->AddPicture("E://3.jpg");//添加图片,并制定其位置为当前光标位置
inlineshapes.Release();
sel.Release();
霜哀 2018-07-25
  • 打赏
  • 举报
回复
霜哀 2018-07-25
  • 打赏
  • 举报
回复
有人吗=-=

3,245

社区成员

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

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