基于Windows 7中的 Ribbon开发技术应用

Windows 7的画图工具采用了微软所称的Scenic Ribbon 界面,这种界面起初是在Office 2007中出现的,也在WordPad出现过 。虽然很多用户还在抱怨"不习惯Ribbon界面"、"很多功能找不到位置"等等,但是,随着微软的"强制" 推行,Ribbon界面也在越来越被人们所接受, 很多应用软件也开始采用Ribbon界面 。更重要的是,在即将到来的Windows 7中,操作系统本身更是大量地应用了Ribbon界面 。不管我们愿意或者不愿意,Ribbon界面开始大张旗鼓地攻占我们的软件界面,成为继下拉式菜单后新的标准用户界面 。作为用户,我们需要逐渐熟悉这种新的软件用户界面;而作为开发者,更是需要了解和认识这种新的软件用户界面,新的交互方式,从而利于这种新界面的优势,为用户提供更加优秀的软件 。"Ribbon来了!"
为了支持开发人员,微软正在确保其设备驱动程序和应用模式在 Vista和Windows 7 之间不变,以确保其兼容性 。但是公司正在努力工作使开发人员接触Windows 7的新技术,以使他们能够在他们自己的解决方案中应用一些新的高级特性 。这包括诸如Jump Lists,PowerShell(《Windows Powershell应用编程最佳实践》此书我正在编写中6月左右出版),"画图"的Scenic Ribbon control以及写字板,以及其它的组件 。
在Office 2007之后介绍了这个Scenic Ribbon.许多昂贵的商业解决方案都已经用到它 。但最后,在即将推出的Windows 7,微软推出了Scenic Ribbon.在这里我第一次尝试在实例中使用从而在这里讲解出来 。Scenic Ribbon是一个在ActiveX对象附加在窗口上,它的整个宽度的窗口,它的高度可配置的 。它的尺寸会根据你的需要而调整 。Ribbon从一个XML 中获得显示数据 。这意味着您只使用几个函数调用,一些初始化并加载数据,以及一个意外事件处理程序触发Ribbon 。由于Ribbon是一个 ActiveX界面,应用程序在XP或Vista下使用会初始化失败,但它会继续运行 。当创建的XML时,运行intentcl.exe程序,创建项目工程文件 。
- 创建一个IUIFramework
IUIFramework* u_f = 0;HRESULT hr = CoCreateInstance(CLSID_ScenicIntentUIFramework, 0,CLSCTX_ALL,__uuidof(IUIFramework),(void**)&u_f);
- 执行一个IUIApplication
这个界面(除了IUnknown成员)有以下三个功能:
1、当一个命令创建时调用ribbon:
virtual HRESULT __stdcall OnCreateUICommand(UINT32 commandId,UI_COMMANDTYPE typeID,IUICommandHandler **commandHandler);
2、当ribbon被一个命令是释放时:
virtual HRESULT __stdcall OnDestroyUICommand(UINT32 commandId, UI_COMMANDTYPE typeID,IUICommandHandler *commandHandler);
3、当ribbon变化时,视图也被相应的改变:
virtual HRESULT __stdcall OnVIEwChanged(UINT32 viewId,UI_VIEWTYPE typeID, IUnknown *view,UI_VIEWVERB verb,INT32 uReasonCode);
-调用IUIFramework::Initialize( )与父窗口的ribbon,和执行IUIApplication。-调用IUIFramework::LoadUI( )与HINSTANCE和资源名称 。
下面的图解释了需要采取的步骤,以实现一个简单的Ribbon应用 。
命令处理程序OnCreateUICommand是调用每一个命令 。看看下面的命令是XML格式 。必须返回一个执行IUICommandHandler(AddRef () !)将处理命令两个成员函数:
HRESULT __stdcall UpdateProperty(UINT32 commandId,REFPROPERTYKEY key,const PROPVARIANT *currentValue,PROPVARIANT *newValue);
当命令调用执行时 。这个"verb"是UI_EXECUTIONVERB枚举,并通知您,触发什么样的事件,例如,字体选择下拉,一个按钮按下等使用OnDestroyUICommand时,将没有必要了调用接口,但不调用Release()。Ribbon将调用它 。这只是通知你的目的是要被销毁,而不是请求释放它自己 。
nVIEwChanged允许从 IUIFramework和查询其状态请求一个接口 。如果typeId == UI_VIEWTYPE_RIBBON和verb== UI_VIEWVERB_CREATE或UI_VIEWVERB_SIZE 例如,这会告诉你,ribbon创建或改变大小,这样你就可以查询IUnknown指针的IUIRibbon并获得其预期的高度 。

推荐阅读