以文本方式查看主题 - 中文XML论坛 - 专业的XML技术讨论区 (http://bbs.xml.org.cn/index.asp) -- 『 Dot NET,C#,ASP,VB 』 (http://bbs.xml.org.cn/list.asp?boardid=43) ---- VS 2010与Windows7共舞 又见Ribbon (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=78131) |
-- 作者:卷积内核 -- 发布时间:11/9/2009 5:21:00 PM -- 现在我们就可以编译这个项目,我们会得到一个常规菜单式界面的普通Windows应用程序。这种呆板的界面是不是有些看得厌烦了呢?现在,我们就来为这个应用程序改头换面,添加上时尚的Ribbon界面。在上文中,我们已经介绍过Ribbon界面的描述是通过xml文件来实现的,所以我们新添加一个XML文件到项目中,然后将其编辑如下: <Application xmlns="http://schemas.microsoft.com/windows/2009/Ribbon">
在这个XML文件中我们可以看到,整个XML文件被分成了两个部分:命令(Commands)和视图(Views)。命令部分会定义各个控件的属性,包括命令的名字(Name),符号(Symbol),标签文本,图标,命令提示等等。这里需要特别注意的是,控件的名字会在下面的视图部分用到,用来指示同一个控件,而控件的符号,则会在对控件消息进行处理时用到,用来指示消息来自哪一个控件。一个更加完整的命令部分看起来像下面这个样子:
<Application.Commands>
在这段代码中,我们定义了一个Tab分页TabHome,然后定义了一个分组GroupMain,最后,我们还定义了一个按钮MyButton,同时定义了这个按钮的标签文本,工具提示,大小图标等。 XML文件的命令部分负责控件的定义,而在视图部分,则是将上面定义的各种命令进行布局,将他们组织到各种控件容器中去,比如分页,分组,工具栏和应用程序菜单等等。同时,视图部分还负责将控件跟各个具体的控件类型绑定起来。一个完整的视图部分看起来像这个样子:
<Application.Views>
上面的XML文件很好地反映了控件之间的嵌套关系:Tab页面包含一个分组,而这个分组又包含一个按钮控件。这样,我们就将我们在命令部分定义的各个控件布局到了Ribbon面板上。 编译Ribbon界面定义文件 完成Ribbon界面定义文件的编辑后,我们需要用UICC.exe将其编译成一种优化后的二进制格式和一个我们通常所用的.rc文件。同时,一个包含了所有控件声明的头文件也会一并产生。这里需要说明的是,UICC.exe是随着Windows 7 SDK一同发布的,要正确地使用UICC.exe,你需要首先正确的安装Windows 7 SDK。 为了完成Ribbon界面定义文件的编译,我们必须定义xml文件的自定义编译过程。在xml文件的属性对话框中,指定其自定义编译命令
uicc.exe ribbonmarkup.xml ribbonmarkup.bml /header:ribbonres.h /res:ribbonres.rc 同时,指定其编译输出为:
ribbonmarkup.bml ribbonres.rc ribbonres.h 这样,我们在编译解决方案的时候,UICC.exe会 将XML文件编译成二进制的BML文件和头文件.h和.rc资源文件的过程。而这些编译输出,都是我们将在后面用到的。 最后,我们需要将编译生成的.rc资源文件引入到我们项目的资源文件中,在项目的资源文件中插入新编译生成的.rc文件,这就表示我们可以使用Ribbon界面定义文件中定义的各种控件作为界面资源了。
///////////////////////////////////////////////////////////////////////////// |
-- 作者:卷积内核 -- 发布时间:11/9/2009 5:22:00 PM -- 为Ribbon界面创建宿主对象 以上的步骤,我们只是完成了Ribbon界面资源的准备,为了实现Ribbon界面的创建,我们还需要为Ribbon界面创建一个宿主对象,这个宿主对象可以接受来自Ribbon界面的不同控件消息,完成Ribbon界面的创建和初始化。 首先,我们需要为项目添加ATL支持,在项目属性中,选择使用静态ATL或者动态ATL: 然后,我们为项目添加一个cpp文件,并在其中实现一个派生自IUIApplication的类,这就是我们为Ribbon界面创建的宿主对象类。
/Precompiled header for the project: //ATL/COM header files: // 引入<uiribbon.h>,其中定义了实现Ribbon界面所需要的所有接口 IUIFramework* g_pFramework = NULL; // 宿主对象类 STDMETHOD(OnCreateUICommand)(UINT32 nCmdID, __in UI_COMMANDTYPE typeID, __deref_out IUICommandHandler** ppCommandHandler) STDMETHOD(OnDestroyUICommand)(UINT32 commandId, __in UI_COMMANDTYPE typeID, __in_opt IUICommandHandler* pCommandHandler)
在这段代码中,我们首先引入了ATL和COM需要的头文件,同时,为了使用Ribbon界面,我们引入了Ribbon界面的头文件。然后,我们创建了一个从IUIApplication派生的类CApplication,并实现了几个必要的成员函数。在这里我们对这些消息并不进行处理,只是简单地返回E_NOTIMPL就可以了 初始化Ribbon界面 完成Ribbon界面的宿主对象后,我们就可以利用这个对象来创建和初始化Ribbon界面了。在Ribbon.cpp中实现一个全局函数进行Ribbon界面的初始化:
IUIFramework* g_pFramework = NULL; // 创建一个宿主对象CApplication // 利用Ribbon Framework对象初始化宿主对象 // 加载Ribbon界面资源,也就是加载XML文件对Ribbon界面的描述 return S_OK;
在这段代码中,我们通过这样三个步骤来完成Ribbon的初始化: • 首先我们调用CoCreateInstance创建IUIFramework对象 • 然后然后创建宿主对象CApplication,并利用IUIFramework对象初始化Ribbon界面的宿主对象CApplication • 最后通过IUIFramework对象加载Ribbon界面资源,以此来完成整个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" CComModule _Module; |
-- 作者:卷积内核 -- 发布时间:11/9/2009 5:22:00 PM -- 在应用程序的主函数_tWinMain中,进行COM的初始化和调用完成后的释放: int APIENTRY _tWinMain(HINSTANCE hInstance, // … // 释放相应资源 return (int) msg.wParam;
然后,我们就可以在InitInstance函数中进行Ribbon界面的初始化了。在显示窗口ShowWindow函数被调用之前,我们添加Ribbon界面的初始化代码。另外,为了防止Ribbon界面窗口在整个窗口缩放的过程中发生闪烁,我们修改了CreateWindow函数的参数,添加了WS_CLIPCHILDREN风格:
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) hInst = hInstance; // Store instance handle in our global variable // 调用InitRibbon函数,完成Ribbon界面的创建和初始化
最后,我们还需要实现Ribbon界面的销毁。我们创建一个函数DestroyRibbon来完成Ribbon界面的销毁工作: void DestroyRibbon()
然后在主窗口销毁的时候,调用这个函数就可以了。在WndProc函数中,在处理WM_DESTROY消息的时候调用DestroyRibbon函数,实现Ribbon界面的销毁:
case WM_DESTROY:
至此,大功告成。现在我们可以编译运行整个项目,就可以看到原来的菜单式界面被更换成了全新的Ribbon界面,整个界面焕然一新了。 为了迎接Windows 7,应用程序们都行动起来,打扮打扮啊~~ |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
10,781.250ms |