初始化Ribbon界面
完成Ribbon界面的宿主对象后,我们就可以利用这个对象来创建和初始化Ribbon界面了。在Ribbon.cpp中实现一个全局函数进行Ribbon界面的初始化:
IUIFramework* g_pFramework = NULL;
/// 初始化Ribbon界面
HRESULT InitRibbon(HWND hWindowFrame)
{
// 调用CoCreateInstance创建一个CLSID_UIRibbonFramework的实例,
// 创建成功后,我们将得到一个IUIFramework对象,
// 并保存在g_pFramework这个实例对象中
//
HRESULT hr = ::CoCreateInstance(CLSID_UIRibbonFramework, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&g_pFramework));
if(FAILED(hr))
{
return hr;
}
// 创建一个宿主对象CApplication
CComObject<CApplication> *pApplication = NULL;
hr = CComObject<CApplication>::CreateInstance(&pApplication);
if(FAILED(hr))
{
return hr;
}
// 利用Ribbon Framework对象初始化宿主对象
hr = g_pFramework->Initialize(hWindowFrame, pApplication);
if(FAILED(hr))
{
return hr;
}
// 加载Ribbon界面资源,也就是加载XML文件对Ribbon界面的描述
// Scenic Ribbon API将以此为根据创建Ribbon界面
g_pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON");
if(FAILED(hr))
{
return hr;
}
return S_OK;
};
/// 初始化Ribbon界面
HRESULT InitRibbon(HWND hWindowFrame)
{
// 调用CoCreateInstance创建一个CLSID_UIRibbonFramework的实例,
// 创建成功后,我们将得到一个IUIFramework对象,
// 并保存在g_pFramework这个实例对象中
//
HRESULT hr = ::CoCreateInstance(CLSID_UIRibbonFramework, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&g_pFramework));
if(FAILED(hr))
{
return hr;
}
// 创建一个宿主对象CApplication
CComObject<CApplication> *pApplication = NULL;
hr = CComObject<CApplication>::CreateInstance(&pApplication);
if(FAILED(hr))
{
return hr;
}
// 利用Ribbon Framework对象初始化宿主对象
hr = g_pFramework->Initialize(hWindowFrame, pApplication);
if(FAILED(hr))
{
return hr;
}
// 加载Ribbon界面资源,也就是加载XML文件对Ribbon界面的描述
// Scenic Ribbon API将以此为根据创建Ribbon界面
g_pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON");
if(FAILED(hr))
{
return hr;
}
return S_OK;
};
在这段代码中,我们通过这样三个步骤来完成Ribbon的初始化:
• 首先我们调用CoCreateInstance创建IUIFramework对象
• 然后然后创建宿主对象CApplication,并利用IUIFramework对象初始化Ribbon界面的宿主对象CApplication
• 最后通过IUIFramework对象加载Ribbon界面资源,以此来完成整个Ribbon界面的初始化过程。
整个过程如下图所示:
图8 Ribbon界面的创建和初始化过程