为Ribbon界面创建宿主对象
以上的步骤,我们只是完成了Ribbon界面资源的准备,为了实现Ribbon界面的创建,我们还需要为Ribbon界面创建一个宿主对象,这个宿主对象可以接受来自Ribbon界面的不同控件消息,完成Ribbon界面的创建和初始化。
首先,我们需要为项目添加ATL支持,在项目属性中,选择使用静态ATL或者动态ATL:
图7 添加ATL支持
然后,我们为项目添加一个cpp文件,并在其中实现一个派生自IUIApplication的类,这就是我们为Ribbon界面创建的宿主对象类。
/Precompiled header for the project:
#include "stdafx.h"
//ATL/COM header files:
#include <atlbase.h>
#include <atlcom.h>
#include <initguid.h>
// 引入<uiribbon.h>,其中定义了实现Ribbon界面所需要的所有接口
#include <uiribbon.h>
IUIFramework* g_pFramework = NULL;
// 宿主对象类
class CApplication
: public CComObjectRootEx<CComMultiThreadModel>
, public IUIApplication
{
public:
BEGIN_COM_MAP(CApplication)
COM_INTERFACE_ENTRY(IUIApplication)
END_COM_MAP()
STDMETHOD(OnViewChanged)(UINT32 nViewID, __in UI_VIEWTYPE typeID, __in IUnknown* pView, UI_VIEWVERB verb, INT32 uReasonCode)
{
return E_NOTIMPL;
}
STDMETHOD(OnCreateUICommand)(UINT32 nCmdID, __in UI_COMMANDTYPE typeID, __deref_out IUICommandHandler** ppCommandHandler)
{
return E_NOTIMPL;
}
STDMETHOD(OnDestroyUICommand)(UINT32 commandId, __in UI_COMMANDTYPE typeID, __in_opt IUICommandHandler* pCommandHandler)
{
return E_NOTIMPL;
}
};
#include "stdafx.h"
//ATL/COM header files:
#include <atlbase.h>
#include <atlcom.h>
#include <initguid.h>
// 引入<uiribbon.h>,其中定义了实现Ribbon界面所需要的所有接口
#include <uiribbon.h>
IUIFramework* g_pFramework = NULL;
// 宿主对象类
class CApplication
: public CComObjectRootEx<CComMultiThreadModel>
, public IUIApplication
{
public:
BEGIN_COM_MAP(CApplication)
COM_INTERFACE_ENTRY(IUIApplication)
END_COM_MAP()
STDMETHOD(OnViewChanged)(UINT32 nViewID, __in UI_VIEWTYPE typeID, __in IUnknown* pView, UI_VIEWVERB verb, INT32 uReasonCode)
{
return E_NOTIMPL;
}
STDMETHOD(OnCreateUICommand)(UINT32 nCmdID, __in UI_COMMANDTYPE typeID, __deref_out IUICommandHandler** ppCommandHandler)
{
return E_NOTIMPL;
}
STDMETHOD(OnDestroyUICommand)(UINT32 commandId, __in UI_COMMANDTYPE typeID, __in_opt IUICommandHandler* pCommandHandler)
{
return E_NOTIMPL;
}
};
在这段代码中,我们首先引入了ATL和COM需要的头文件,同时,为了使用Ribbon界面,我们引入了Ribbon界面的头文件