将Ribbon界面整合到应用程序
完成Ribbon界面的创建和初始化后,这就意味着我们可以在应用程序中使用Ribbon界面了。我们知道Windows Scenic Ribbon API是基于COM接口的,所以要使用Ribbon界面,我们首先需要进行COM的初始化工作,然后调用Ribbon界面的初始化函数完成Ribbon界面和应用程序的整合。修改项目默认创建的RibbonApp.cpp,进行COM的初始化和Ribbon界面的初始化。
首先,我们引入相应的头文件和全局函数声明:
// RibbonApp.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "RibbonApp.h"
#include <atlbase.h>
CComModule _Module;
extern HRESULT InitRibbon(HWND hWindowFrame);
extern void DestroyRibbon();
//
#include "stdafx.h"
#include "RibbonApp.h"
#include <atlbase.h>
CComModule _Module;
extern HRESULT InitRibbon(HWND hWindowFrame);
extern void DestroyRibbon();
在应用程序的主函数_tWinMain中,进行COM的初始化和调用完成后的释放:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// 初始化COM
CoInitialize(NULL);
// …
// 释放相应资源
CoUninitialize();
return (int) msg.wParam;
}
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
// 初始化COM
CoInitialize(NULL);
// …
// 释放相应资源
CoUninitialize();
return (int) msg.wParam;
}
然后,我们就可以在InitInstance函数中进行Ribbon界面的初始化了。在显示窗口ShowWindow函数被调用之前,我们添加Ribbon界面的初始化代码。另外,为了防止Ribbon界面窗口在整个窗口缩放的过程中发生闪烁,我们修改了CreateWindow函数的参数,添加了WS_CLIPCHILDREN风格:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
// 修改CreateWindows的参数,防止窗口闪烁
hWnd = CreateWindow(szWindowClass, szTitle,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL,
hInstance, NULL);
/*
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
*/
if (!hWnd)
{
return FALSE;
}
// 调用InitRibbon函数,完成Ribbon界面的创建和初始化
HRESULT hr = InitRibbon(hWnd);
if (FAILED(hr))
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
{
HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
// 修改CreateWindows的参数,防止窗口闪烁
hWnd = CreateWindow(szWindowClass, szTitle,
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL,
hInstance, NULL);
/*
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
*/
if (!hWnd)
{
return FALSE;
}
// 调用InitRibbon函数,完成Ribbon界面的创建和初始化
HRESULT hr = InitRibbon(hWnd);
if (FAILED(hr))
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}