在接口ICommands添加接口函数,那么相应的我们 也要在类CCommands中声明和实现ICommands接口函数,函数的内部代码和普通工 程代码没什么区别。
//Implement(CCommands类内部接口函数的声 明)
public:
STDMETHOD(GetCurDirCommandMethod)(THIS);
STDMETHOD(QuitCommandMethod)(THIS);
//Function Code (Ccommands类内部接口函数的实现)
//得到当前VC开发环境的工作目录[您 也可以让它成为你想要实现的功能代码]
STDMETHODIMP CCommands::GetCurDirCommandMethod()
{
AFX_MANAGE_STATE (AfxGetStaticModuleState());
VERIFY_OK(m_pApplication- >EnableModeless(VARIANT_FALSE));
BSTR bstrCurDir;
m_pApplication->get_CurrentDirectory(&bstrCurDir);
CString str(bstrCurDir);
::MessageBox(NULL, str, "VC工作 目录", MB_OK | MB_ICONINFORMATION);
VERIFY_OK (m_pApplication->EnableModeless(VARIANT_TRUE));
return S_OK;
}
//退出VC开发环境
STDMETHODIMP CCommands::QuitCommandMethod()
{
AFX_MANAGE_STATE (AfxGetStaticModuleState());
VERIFY_OK(m_pApplication- >EnableModeless(VARIANT_FALSE));
if(::MessageBox(NULL,
"您想退出VC++(www.cppentry.com)编辑器吗(Y/N) ",
" 询问信息...",
MB_YESNO | MB_ICONQUESTION) == IDYES)
m_pApplication->Quit();
VERIFY_OK (m_pApplication->EnableModeless(VARIANT_TRUE));
return S_OK;
}
<3.4> 创建工具栏,连接工具栏按钮事件
所 有的幕后工作已经准备就绪,只差个工具栏界面就一切OK了。打开类CDSAddIn, 它里面有三个成员函数,其中OnConnection和OnDisconnection成员函数的意义 非常重要。它们的意义如下:
<1>OnConnection:插件的初始化任 务都在这里完成。如COM服务的启动,工具栏/菜单栏的创建,工具栏按钮/菜单 项的添加与修改等等。
<2>OnDisconnection:插件的卸载工作都 在这里完成。如COM服务的卸载,工具栏/菜单栏的销毁,释放等等。
了 解了它们各自的用途之后我们就可以在相应的消息事件中添加代码了。很显然工 具栏的初始化应该在OnConnection事件中完成。
在OnConnection事件中 系统首先获得了VC应用程序接口,然后调用一个接口函数:AddCommand来为插件 添加命令和命令影射函数。然后再使用另外一个接口函数AddCommandBarButton 向工具栏中添加工具栏按钮,其中每个工具栏按钮会和一个命令标志符号相连接 ,这样就能实现按钮和命令(消息)之间的一一对应。下面是添加一个命令和一 个工具栏按钮的代码(如果你要添加多个工具栏按钮只要重复此步骤即可):
LPCTSTR szCommand = _T("GetCurDirCommand");
VARIANT_BOOL bRet;
CString strCmdString;
strCmdString.LoadString(IDS_CMD_STRING);
strCmdString = szCommand + strCmdString;
CComBSTR bszCmdString(strCmdString);
CComBSTR bszMethod(_T("GetCurDirCommandMethod"));
CComBSTR bszCmdName(szCommand); //和下面添加工具栏按钮对应
VERIFY_OK(pApplication->AddCommand (bszCmdString,bszMethod,0,dwCookie,&bRet));
//AddCommand 参数 含义:
//bszCmdString:命令字符串。
//bszMethod:Icommands接 口函数名。
//第三个参数代表位图偏移量。
//第四和第五个参数分 贝为系统参数和返回值(参照MSDN的IApplication介绍)
if (bRet == VARIANT_FALSE)
{
*OnConnection = VARIANT_FALSE;
return S_OK;
}
//添加工具栏按钮
if (bFirstTime == VARIANT_TRUE)
{
VERIFY_OK(pApplication- >AddCommandBarButton(dsGlyph, bszCmdName, m_dwCookie));
}