VC++编写DLL,在Word 2003中临时地、流氓地加入工具栏一个。当用户单机按钮时,运行DLL中指定代码。本文没有讨论的技术:嵌入其他控件、创建安装程序。
效果是这样的:
程序文件在这里:
http://webdisk.cech.com.cn/download/file_share_3089502.html
[关键技术]
COM、ATL
[过程]
1、建立ATL工程,允许合并代理/存根代码
2、创建一个ATL简单对象,建议支持ISupportErrorInfo,没有也可以
3、为2添加实现接口:Microsoft Add-In Designer 的第一个
4、修改2的.rgs文件:
HKCU
{
Software
{
Microsoft
{
Office
{
Word
{
Addins
{
'wordAddin.tcWordButton'
{
val FriendlyName = s '[tc]WordButton'
val Description = s '[tc]的COM实验-wordAddin.tcWordButton'
val LoadBehavior = d '00000003'
val CommandLineSafe = d '00000000'
}
}
}
}
}
}
}
5、为On Connection编写实现
(1)(不贴了)
(2)在stdafx.h中添加
#imp ort "C:\Program Files\Common Files\Microsoft Shared\OFFICE11\MSO.DLL" \
rename_namespace("Office") \
rename("RGB", "RBGXL")
// named_guids
//exclude("IFont","IPicture") \
// rename("DocumentProperties", "DocumentPropertiesXL") \
using namespace Office;
#imp ort "C:\Program Files\Microsoft Office\Office11\MSWORD.OLB" \
raw_interfaces_on ly \
rename("ExitWindows", "wordExitWindows") \
rename_namespace("MSWord")
using namespace MSWord;
6、添加SINK
(1)
BEGIN_SINK_MAP(CtcWordButton)
SINK_ENTRY_INFO(1,__uuidof(Office::_CommandBarButtonEvents),
/*dispid*/ 0x01, On ClickButton1, &On ClickButtonInfo1)
END_SINK_MAP()
(2)当然这个之前ATL_NO_VTABLE那里基类添加一句
public IDispEventSimpleImpl<1, CtcWordButton,&__uuidof(Office::_CommandBarButtonEvents)>
(3)public那里添加一句
typedef IDispEventSimpleImpl<<span style="color: green">/*nID =*/ 1,
CtcWordButton, &__uuidof(Office::_CommandBarButtonEvents)>
CommandButtonEvents1;
7、然后
(1)回到On Connection
// 创建按钮的事件连接
m_spButton1 = spCmdButton1;
hr = CommandButtonEvents1::DispEventAdvise((IDispatch*)m_spButton1);
(2)到On Disconnection
// 取消按钮的事件连接
HRESULT hr = CommandButtonEvents1::DispEventUnadvise(
(IDispatch*)m_spButton1);
8、为了显示透明图标
(1)在资源里面建立一个位图,假设叫IDB_BITMAP
(2)然后建立一个Mask位图,内容是背景黑色、前景白色的图片,假设叫IDB_BITMAP_MASK
9、图标有3种方法建立:
(1)利用剪贴版
::OpenClipboard(NULL);
::EmptyClipboard();
::SetClipboardData(CF_BITMAP, (HANDLE)hBmp);
::CloseClipboard();
::DeleteObject(hBmp);
hr = spCmdButton1->PasteFace();
(2)利用内置图标
spCmdButton1->PutFaceId(1760);
(3)利用PutPicture
// 位图为32x32大小
// hBmpDesc是前景
HBITMAP hBmpDesc =(HBITMAP)::LoadImage(_Module_HINSTANCE, //_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
PICTDESC pictDesc;
memset(&pictDesc, 0, sizeof(pictDesc));
pictDesc.cbSizeofstruct = sizeof(pictDesc);
pictDesc.picType = PICTYPE_BITMAP;
pictDesc.bmp.hbitmap = hBmpDesc;
CComPtr spPict;
hr = OleCreatePictureIndirect( &pictDesc, IID_IPictureDisp, TRUE, (void**)&spPict );
// hBmpMask是Mask
HBITMAP hBmpMask =(HBITMAP)::LoadImage(_Module_HINSTANCE, //_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
PICTDESC pictMask;
memset(&pictMask, 0, sizeof(pictMask));
pictMask.cbSizeofstruct = sizeof(pictMask);
pictMask.picType = PICTYPE_BITMAP;
pictMask.bmp.hbitmap = hBmpMask;
CComPtr spPictMask;
hr = OleCreatePictureIndirect( &pictMask, IID_IPictureDisp, TRUE, (void**)&spPictMask );// 粘贴前设置显示风格
spCmdButton1->PutStyle(Office::msoButtonIconAndCaption);
spCmdButton1->PutPicture( spPict );
spCmdButton1->PutMask( spPictMask );
10、响应函数请这样声明
VOID __stdcall CtcWordButton::On ClickButton1
(IDispatch* /*Office::_CommandBarButton* */ Ctrl,
VARIANT_BOOL * CancelDefault)
效果是这样的:
程序文件在这里:
http://webdisk.cech.com.cn/download/file_share_3089502.html
[关键技术]
COM、ATL
[过程]
1、建立ATL工程,允许合并代理/存根代码
2、创建一个ATL简单对象,建议支持ISupportErrorInfo,没有也可以
3、为2添加实现接口:Microsoft Add-In Designer 的第一个
4、修改2的.rgs文件:
HKCU
{
Software
{
Microsoft
{
Office
{
Word
{
Addins
{
'wordAddin.tcWordButton'
{
val FriendlyName = s '[tc]WordButton'
val Description = s '[tc]的COM实验-wordAddin.tcWordButton'
val LoadBehavior = d '00000003'
val CommandLineSafe = d '00000000'
}
}
}
}
}
}
}
5、为On
(1)(不贴了)
(2)在stdafx.h中添加
#imp
rename_namespace("Office") \
rename("RGB", "RBGXL")
// named_guids
//exclude("IFont","IPicture") \
// rename("DocumentProperties", "DocumentPropertiesXL") \
using namespace Office;
#imp
raw_interfaces_on
rename("ExitWindows", "wordExitWindows") \
rename_namespace("MSWord")
using namespace MSWord;
6、添加SINK
(1)
BEGIN_SINK_MAP(CtcWordButton)
SINK_ENTRY_INFO(1,__uuidof(Office::_CommandBarButtonEvents),
/*dispid*/ 0x01, On
END_SINK_MAP()
(2)当然这个之前ATL_NO_VTABLE那里基类添加一句
public IDispEventSimpleImpl<1, CtcWordButton,&__uuidof(Office::_CommandBarButtonEvents)>
(3)public那里添加一句
typedef IDispEventSimpleImpl<<span style="color: green">/*nID =*/ 1,
CtcWordButton, &__uuidof(Office::_CommandBarButtonEvents)>
CommandButtonEvents1;
7、然后
(1)回到On
// 创建按钮的事件连接
m_spButton1 = spCmdButton1;
hr = CommandButtonEvents1::DispEventAdvise((IDispatch*)m_spButton1);
(2)到On
// 取消按钮的事件连接
HRESULT hr = CommandButtonEvents1::DispEventUnadvise(
(IDispatch*)m_spButton1);
8、为了显示透明图标
(1)在资源里面建立一个位图,假设叫IDB_BITMAP
(2)然后建立一个Mask位图,内容是背景黑色、前景白色的图片,假设叫IDB_BITMAP_MASK
9、图标有3种方法建立:
(1)利用剪贴版
::OpenClipboard(NULL);
::EmptyClipboard();
::SetClipboardData(CF_BITMAP, (HANDLE)hBmp);
::CloseClipboard();
::DeleteObject(hBmp);
hr = spCmdButton1->PasteFace();
(2)利用内置图标
spCmdButton1->PutFaceId(1760);
(3)利用PutPicture
// 位图为32x32大小
// hBmpDesc是前景
HBITMAP hBmpDesc =(HBITMAP)::LoadImage(_Module_HINSTANCE, //_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
PICTDESC pictDesc;
memset(&pictDesc, 0, sizeof(pictDesc));
pictDesc.cbSizeofstruct = sizeof(pictDesc);
pictDesc.picType = PICTYPE_BITMAP;
pictDesc.bmp.hbitmap = hBmpDesc;
CComPtr spPict;
hr = OleCreatePictureIndirect( &pictDesc, IID_IPictureDisp, TRUE, (void**)&spPict );
// hBmpMask是Mask
HBITMAP hBmpMask =(HBITMAP)::LoadImage(_Module_HINSTANCE, //_Module.GetResourceInstance(),
MAKEINTRESOURCE(IDB_BITMAP),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS);
PICTDESC pictMask;
memset(&pictMask, 0, sizeof(pictMask));
pictMask.cbSizeofstruct = sizeof(pictMask);
pictMask.picType = PICTYPE_BITMAP;
pictMask.bmp.hbitmap = hBmpMask;
CComPtr spPictMask;
hr = OleCreatePictureIndirect( &pictMask, IID_IPictureDisp, TRUE, (void**)&spPictMask );// 粘贴前设置显示风格
spCmdButton1->PutStyle(Office::msoButtonIconAndCaption);
spCmdButton1->PutPicture( spPict );
spCmdButton1->PutMask( spPictMask );
10、响应函数请这样声明
VOID __stdcall CtcWordButton::On
(IDispatch* /*Office::_CommandBarButton* */ Ctrl,
VARIANT_BOOL * CancelDefault)