技术开发 频道

VS 2010与Windows7共舞:又见Ribbon

  将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();

  在应用程序的主函数_tWinMain中,进行COM的初始化和调用完成后的释放:

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     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;
}
0
相关文章