Windows 7的画图工具采用了微软所称的Scenic Ribbon 界面,这种界面起初是在Office 2007中出现的,也在WordPad出现过
-调用IUIFramework::LoadUI( )与HINSTANCE和资源名称
nViewChanged允许从 IUIFramework和查询其状态请求一个接口
而且,这里是如何创建一个标签与一些组:
%26lt;Ribbon.Tabs%26gt; . %26lt;Tab CommandName="Tab1" %26gt;
%26lt;Tab.ScalingPolicy%26gt;
%26lt;ScalingPolicy%26gt;
%26lt;ScalingPolicy.IdealSizes%26gt;
%26lt;Scale Group="g1" Size="Large" /%26gt;
%26lt;Scale Group="g2" Size="Large" /%26gt;
%26lt;Scale Group="g3" Size="Large" /%26gt;
%26lt;Scale Group="g4" Size="Large" /%26gt;
%26lt;/ScalingPolicy.IdealSizes%26gt;
%26lt;/ScalingPolicy%26gt;
%26lt;/Tab.ScalingPolicy%26gt;
%26lt;Group CommandName="g1" SizeDefinition="OneButton"%26gt;
%26lt;Button CommandName="cmdNew" /%26gt;
%26lt;/Group%26gt;
%26lt;Group CommandName="g2" SizeDefinition="ThreeButtons"%26gt;
%26lt;Button CommandName="cmdNew" /%26gt;
%26lt;Button CommandName="cmdOpen" /%26gt;
%26lt;Button CommandName="cmdSave" /%26gt;
%26lt;DialogLauncher CommandName="cmdSave" /%26gt;
%26lt;/Group%26gt;
%26lt;Group CommandName="g3" SizeDefinition="OneFontControl"%26gt;
%26lt;FontControl CommandName = "Font1" FontType = "RichFont" /%26gt;
%26lt;/Group%26gt;
%26lt;Group CommandName="g4"%26gt;
%26lt;DropDownColorPicker CommandName="cpick1" ChipSize = "Large" /%26gt;
%26lt;/Group%26gt;
%26lt;/Tab%26gt;
注意,该标签已经提到命令" Tab1 "其中包含的标签名称

命令处理程序OnCreateUICommand是调用每一个命令
ribbon 基本要素:一套命令,每个人可以有一个ID,一个符号,一个标签,一个提示,和一套图像
www.orchn.com
下面的图解释了需要采取的步骤,以实现一个简单的Ribbon应用
www.orchn.com
为了避免上述所有的问题,把这些接口包装到类库
以下是如何创造一个"应用程序的菜单":
%26lt;Ribbon.ApplicationMenu%26gt;
%26lt;ApplicationMenu CommandName="cmdn1"%26gt;
%26lt;MenuGroup Class="MajorItems"%26gt;
%26lt;Button CommandName="cmdNew" /%26gt;
%26lt;Button CommandName="cmdOpen" /%26gt;
%26lt;Button CommandName="cmdSave" /%26gt;
%26lt;/MenuGroup%26gt;
%26lt;/ApplicationMenu%26gt;
%26lt;/Ribbon.ApplicationMenu%26gt;
现在,你有一个应用程序的菜单中有三个按钮:新建,打开,保存
例如,这里的定义是在" Tab1 "
%26lt;Tab CommandName="Tab1" ApplicationModes="0,2"%26gt;
这意味着,当位0或2位在当前选定的模式设置,然后在标签的显示
总结:随着Windows平台的发展升级,往往都伴随着系统图形界面的重新设计
这些组都必须标明具体的"大小"和布局;所以举例来说,如果你想说, 6组内的按钮,你只有三种预定义的方式,安排他们
这意味着,如果您的组是" OneButton " ,它必须被设置为"大"规模的大小
以下是如何建立快速访问工具栏:
%26lt;Ribbon.QuickAccessToolbar%26gt;
%26lt;QuickAccessToolbar CustomizeCommandName="cmdCustomize"%26gt;
%26lt;QuickAccessToolbar.ApplicationDefaults%26gt;
%26lt;Button CommandName="cmdNew" /%26gt;
%26lt;/QuickAccessToolbar.ApplicationDefaults%26gt;
%26lt;/QuickAccessToolbar%26gt;%26lt;/Ribbon.QuickAccessToolbar%26gt;
现在,你有一个快速访问工具栏的新的内部指令,加上一个按钮定义的" cmdCustomize "这应该可以自定义快速访问工具栏
例如,当我得到通知, WndProc的颜色选择,它适用于它的背景颜色的ribbon如下:
PROPVARIANT val;// Get the property of the control we pushedHRESULT hr = rm-%26gt;u_f-%26gt;GetUICommandProperty(rm-%26gt;cmd,UI_PKEY_Color,%26amp;val);
IPropertyStore* st = 0;rm-%26gt;u_f-%26gt;QueryInterface(
__uuidof(IPropertyStore),(void**)%26amp;st);if (st %26amp;%26amp; SUCCEEDED(hr)
)
{
st-%26gt;SetValue(UI_PKEY_GlobalBackgroundColor,val); st-%26gt;Commit();
}
如果在字体控制,您只需查询IUnknown 指针* pointer的IPropertyStore和使用UI_PKEY_FontProperties_XXXX键
同样可以很容易的适用于程序组
我们如何获得从颜色选择器值?检查type == UI_COMMANDTYPE_COLORANCHOR和PROPVARIANT "cv"值包含一个整数,代表的RGB
这里是一组实例命令:
%26lt;Command Name="cmdNew"
LabelTitle="New " Symbol="cmdNew"
Comment="New"
Id="22001"
TooltipTitle="Tooltip Title"
TooltipDescription="Tooltip Text"%26gt;
%26lt;Command.SmallImages%26gt;
%26lt;Image%26gt;1-32a.bmp%26lt;/Image%26gt;
%26lt;/Command.SmallImages%26gt;
%26lt;Command.LargeImages%26gt;
%26lt;Image%26gt;1-32a.bmp%26lt;/Image%26gt;
%26lt;/Command.LargeImages%26gt;
%26lt;/Command%26gt;
%26lt;Command Name="cmdOpen" LabelTitle="Open " Symbol="cmdOpen" Comment="Open" Id="22002" /%26gt;
%26lt;Command Name="cmdSave" LabelTitle="Save " Symbol="cmdSave" Comment="Save" Id="22003" /%26gt;
%26lt;Command Name="Tab1" LabelTitle="First Tab" Symbol="_44" Id="30001"/%26gt;
%26lt;Command Name="Tab2" LabelTitle="Second Tab" Id="30002"/%26gt;
%26lt;Command Name="cx1" LabelTitle="Check Box 1" /%26gt;
%26lt;Command Name="Font1" LabelTitle="Font Selection1" /%26gt;
%26lt;Command Name="cpick1" LabelTitle="Choose Color" /%26gt;
%26lt;Command Name="cmdn1" LabelTitle="Main Menu" /%26gt;
%26lt;Command Name="g1" LabelTitle="Group 1" /%26gt;
请注意, "按钮"命令,将需要的图片(小16x16 ,或大32x32,或64x64点英寸,但我已经发现,ribbon大的图像调整得很好) ,但其他的"命令"像标签标或一组标签只需要姓名和头衔,因为没有命令编号与他们有联系的
www.orchn.com "Ribbon来了!"
为了支持开发人员,微软正在确保其设备驱动程序和应用模式在 Vista和Windows 7 之间不变,以确保其兼容性
%26lt;Group CommandName="g1" SizeDefinition="OneButton" ApplicationModes="3"%26gt; 为了获取/设置ribbon管理的一些状态,

在Office 2007之后介绍了这个Scenic Ribbon.许多昂贵的商业解决方案都已经用到它
服务器
LRESULT CALLBACK Main_DP(HWND hh,UINT mm,WPARAM ww,LPARAM ll)
{
if (mm == MESSAGE_RIBBON)
{
RIBBON_MESSAGE* rm = (RIBBON_MESSAGE*)ll;
if (!rm)
if (rm-%26gt;update == false %26amp;%26amp; rm-%26gt;verb == UI_EXECUTIONVERB_EXECUTE
%26amp;%26amp; rm-%26gt;type == UI_COMMANDTYPE_ACTION)
SendMessage(hh,WM_COMMAND,rm-%26gt;cmd,0);
}
}
分析Ribbon的XML数据格式由于ribbon本质上是一个代表性的一个XML地图,在这里您将实际花费大部分的时间来制定一个好的和工作ribbon.
而在微软的下一代Windows平台Windows 7中,虽然Aero被保留下来,但是Windows 7的图形用户界面更多的是朝着Office 2007相同的方向前进,无论是系统自带的工具软件,例如画图、写字板等,还是上层的第三方应用软件,例如Office 2007、AutoCAD、SnagIt等等,都全面应用了Ribbon界面
www.orchn.com Ribbon从一个XML 中获得显示数据
Ribbon将调用它
Scenic Ribbon是一个在ActiveX对象附加在窗口上,它的整个宽度的窗口,它的高度可配置的
int%26amp; DesiredHeight();
返回理想高度ribbonvoid SetHeight(int);允许设置ribbon高度
调用类库向父窗口发送一个预定义的MESSAGE_RIBBON (const int MESSAGE_RIBBON = RegisterWindowMessage(L"{E733E4DA-904C-486b-B5FB-6201773D69DE}");),与 WPARAM设置为RIBBON *类,和LPARAM设置为RIBBON_MESSAGE结构:
struct RIBBON_MESSAGE{ IUIFramework * u_f;
// Pointer to the IUIFramework of the ribbon UINT32 cmd;
// Command ID UINT32 reason;
// Reason code (When View is changed) UI_COMMANDTYPE type;
// Type of the command UI_VIEWTYPE vtype;
// Verb Type of the view change (When View is changed) UI_VIEWVERB vverb
; // Verb of the view change (When View is changed) UI_EXECUTIONVERB verb;
// Verb of the command const PROPERTYKEY* key;
// Contains the new value const PROPVARIANT* cv;
// Contains the current value IUISimplePropertySet* pset;
// Contains an interface which you can set/query values void* view;
// Contains an IUnknown* of the view interface
// (when view is changed) which you
// can use to query for an IUIRibbon. bool update;
// true if view is changed. };
因此,如果您只是想重定向消息到WM_COMMAND ,您检查update ==false,erb== UI_EXECUTIONVERB_EXECUTE ,和type == UI_COMMANDTYPE_ACTION
void DestroyMarkup();销毁加载的ribbon
www.orchn.com

- 创建一个IUIFramework
IUIFramework* u_f = 0;HRESULT hr = CoCreateInstance(CLSID_ScenicIntentUIFramework, 0,CLSCTX_ALL,__uuidof(IUIFramework),(void**)%26amp;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
通信 一个RIBBON类,并且你使用如下:
RIBBON(HWND hh = 0);~RIBBON();bool Initialize();
Ribbon初始化成功返回Ture
bool LoadMarkup(HINSTANCE hInst,LPCWSTR resourceName);
Ribbon初始化成功返回Turebool LoadMarkup(HINSTANCE hInst,LPCWSTR resourceName);
从资源里加载ribbon,如果现有的ribbon被加载,则释放它
一套要素,包括一个"应用程序的菜单" ,一个"快速访问工具栏"和"ribbon" ,其中载有一些标签
不管我们愿意或者不愿意,Ribbon界面开始大张旗鼓地攻占我们的软件界面,成为继下拉式菜单后新的标准用户界面
从Windows XP到Windows Vista,最大的革新就是Windows Aero的引入
但是公司正在努力工作使开发人员接触Windows 7的新技术,以使他们能够在他们自己的解决方案中应用一些新的高级特性
但最后,在即将推出的windows 7,微软推出了Scenic Ribbon.在这里我第一次尝试在实例中使用从而在这里讲解出来
服务器 作为用户,我们需要逐渐熟悉这种新的软件用户界面;而作为开发者,更是需要了解和认识这种新的软件用户界面,新的交互方式,从而利于这种新界面的优势,为用户提供更加优秀的软件
因此,当我请Ribbon:: SetModes(0) ,此标签将会隐藏
如果typeId == UI_VIEWTYPE_RIBBON和verb== UI_VIEWVERB_CREATE或UI_VIEWVERB_SIZE 例如,这会告诉你,ribbon创建或改变大小,这样你就可以查询IUnknown指针的IUIRibbon并获得其预期的高度
它的尺寸会根据你的需要而调整
应用模式适用于组和标签
服务器 当创建的XML时,运行intentcl.exe程序,创建项目工程文件
www.orchn.com 当我使用2个或8或任何整数,那么0或2位设置,该标签将显示
必须返回一个执行IUICommandHandler(AddRef ()+!)将处理命令两个成员函数:
HRESULT __stdcall UpdateProperty(UINT32 commandId,REFPROPERTYKEY key, const PROPVARIANT *currentValue,PROPVARIANT *newValue);
当命令调用执行时
您可以使用IUIFramework:: GetUICommandProperty获得一个特殊键,或者您也可以查询"cv" IUnknown成员通过RIBBON_MESSAGE结构的IPropertyStore ;使用GetValue() / SetValue() /提交到读/写性能引用控制
您可以查看示例的自定义模板
您定义这些命令为"按钮"和其他因素,如标签或一组标签
网络 我们如何获得字体选择值?该类型UI_COMMANDTYPE_FONT和PROPVARIANT "cv"值包含一个IUnknown ,但我还没有找到如何获得让字体!
根据您的应用程序的背景,您可能需要一些标签和/或组显示或者隐藏
我的上述4组有一些按钮,字体选择和颜色选择器
明确的插入每一个组/标签,ribbon提供了"应用模式" ,这是一个32位模式的字节设置,他们应该是"active"
更重要的是,在即将到来的Windows 7中,操作系统本身更是大量地应用了Ribbon界面
有一个预定义的一些模板,但你也可以使用%26lt;SizeDefinition%26gt;定制模板
通信 此标签有四个组,缩放的政策不是任意设置为"大" , "中等"或"小" ,但它依赖于一些控制和布局模板
每个小组可以有许多事情,包括按钮,旋转按钮,下拉,字体控制,颜色选择器,对话框启动器,分离器,和所有的东西中描述的标记元素网页
每个标签可以有一些组,每个组都可以有一些预定义的控制
由于Ribbon是一个 ActiveX界面,应用程序在XP或Vista下使用会初始化失败,但它会继续运行
看看下面的命令是XML格式
网络 虽然很多用户还在抱怨"不习惯Ribbon界面"、"很多功能找不到位置"等等,但是,随着微软的"强制" 推行,Ribbon界面也在越来越被人们所接受, 很多应用软件也开始采用Ribbon界面
请注意,Ribbon使用户可以改变按钮,出现在快速访问工具栏
还有一些"整体"键,您查询IUIFramework直接的IPropertyStore
www.orchn.com 这个"verb"是UI_EXECUTIONVERB枚举,并通知您,触发什么样的事件,例如,字体选择下拉,一个按钮按下等使用OnDestroyUICommand时,将没有必要了调用接口,但不调用Release()
这包括诸如Jump Lists,PowerShell(《Windows Powershell应用编程最佳实践》此书我正在编写中6月左右出版),"画图"的Scenic Ribbon control以及写字板,以及其它的组件
www.orchn.com 这只是通知你的目的是要被销毁,而不是请求释放它自己
www.orchn.com 这意味着您只使用几个函数调用,一些初始化并加载数据,以及一个意外事件处理程序触发Ribbon
0
顶一下0
踩一下