设为首页 收藏本站
查看: 632|回复: 0

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

[复制链接]

尚未签到

发表于 2015-5-9 12:45:10 | 显示全部楼层 |阅读模式
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以及写字板,以及其它的组件。
DSC0000.gif
  在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并获得其预期的高度。
  为了避免上述所有的问题,把这些接口包装到类库。一个RIBBON类,并且你使用如下:

RIBBON(HWND hh = 0);
~RIBBON();
bool Initialize();   Ribbon初始化成功返回Ture

bool LoadMarkup(HINSTANCE hInst,LPCWSTR resourceName);   Ribbon初始化成功返回Ture
bool LoadMarkup(HINSTANCE hInst,LPCWSTR resourceName);
  从资源里加载ribbon,如果现有的ribbon被加载,则释放它。
void DestroyMarkup();
销毁加载的ribbon。
int& DesiredHeight();
  返回理想高度ribbon
void 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 。

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->update == false && rm->verb == UI_EXECUTIONVERB_EXECUTE
                                && rm->type == UI_COMMANDTYPE_ACTION)
            SendMessage(hh,WM_COMMAND,rm->cmd,0);
        }

}  分析Ribbon的XML数据格式
由于ribbon本质上是一个代表性的一个XML地图,在这里您将实际花费大部分的时间来制定一个好的和工作ribbon.。
  ribbon基本要素:一套命令,每个人可以有一个ID,一个符号,一个标签,一个提示,和一套图像。您定义这些命令为“按钮”和其他因素,如标签或一组标签。
一套要素,包括一个“应用程序的菜单” ,一个“快速访问工具栏”和“ribbon” ,其中载有一些标签。每个标签可以有一些组,每个组都可以有一些预定义的控制。
  这些组都必须标明具体的“大小”和布局;所以举例来说,如果你想说, 6组内的按钮,你只有三种预定义的方式,安排他们。
这里是一组实例命令:


     
        1-32a.bmp
      
      
        1-32a.bmp
      
   








  请注意, “按钮”命令,将需要的图片(小16x16 ,或大32x32,或64x64点英寸,但我已经发现,ribbon大的图像调整得很好) ,但其他的“命令”像标签标或
一组标签只需要姓名和头衔,因为没有命令编号与他们有联系的。
  以下是如何创造一个“应用程序的菜单”:


   
      
        
        
        
      
   
  现在,你有一个应用程序的菜单中有三个按钮:新建,打开,保存。 以下是如何建立快速访问工具栏:


     
         
            
         
     
  现在,你有一个快速访问工具栏的新的内部指令,加上一个按钮定义的“ cmdCustomize ”这应该可以自定义快速访问工具栏。请注意,Ribbon使用户可以改变按钮,出现在快速访问工具栏。
  而且,这里是如何创建一个标签与一些组:


            .
   
      
        
         
            
            
            
            
         
        
      
      
        
      
      
        
        
        
        
      
      
        
      
      
        
      
  
  注意,该标签已经提到命令“ Tab1 ”其中包含的标签名称。此标签有四个组,缩放的政策不是任意设置为“大” , “中等”或“小” ,但它依赖于一些控制和布局模板。
  这意味着,如果您的组是“ OneButton ” ,它必须被设置为“大”规模的大小。
有一个预定义的一些模板,但你也可以使用定制模板。您可以查看示例的自定义模板。 每个小组可以有许多事情,包括按钮,旋转按钮,下拉,字体控制,
颜色选择器,对话框启动器,分离器,和所有的东西中描述的标记元素网页。我的上述4组有一些按钮,字体选择和颜色选择器。
我们如何获得从颜色选择器值?检查type == UI_COMMANDTYPE_COLORANCHOR和PROPVARIANT “cv”值包含一个整数,代表的RGB 。
我们如何获得字体选择值?该类型UI_COMMANDTYPE_FONT和PROPVARIANT “cv”值包含一个IUnknown ,但我还没有找到如何获得让字体!
  根据您的应用程序的背景,您可能需要一些标签和/或组显示或者隐藏。明确的插入每一个组/标签,ribbon提供了“应用模式” ,这是一个32位模式的字节设置,他们应该是
“active” 。应用模式适用于组和标签。
  例如,这里的定义是在“ Tab1 ”
  
  这意味着,当位0或2位在当前选定的模式设置,然后在标签的显示。因此,当我请Ribbon:: SetModes ( 0 ) ,此标签将会隐藏。当我使用2个或8或任何整数,那么0或2位设置
,该标签将显示。 同样可以很容易的适用于程序组。


     为了获取/设置ribbon管理的一些状态,。您可以使用IUIFramework::  GetUICommandProperty获得一个特殊键,或者您也可以查询“cv” IUnknown成员通过
RIBBON_MESSAGE结构的IPropertyStore ;使用GetValue ( ) / SetValue ( ) /提交到读/写性能引用控制。还有一些“整体”键,您查询IUIFramework直接的IPropertyStore 。
例如,当我得到通知, WndProc的颜色选择,它适用于它的背景颜色的ribbon如下:

PROPVARIANT val;
// Get the property of the control we pushed
HRESULT hr = rm->u_f->GetUICommandProperty(rm->cmd,UI_PKEY_Color,&val);
IPropertyStore* st = 0;
rm->u_f->QueryInterface(__uuidof(IPropertyStore),(void**)&st);
if (st && SUCCEEDED(hr))
{
st->SetValue(UI_PKEY_GlobalBackgroundColor,val);
st->Commit();
  }  如果在字体控制,您只需查询IUnknown 指针* pointer的IPropertyStore和使用UI_PKEY_FontProperties_XXXX键。
  总结:随着Windows平台的发展升级,往往都伴随着系统图形界面的重新设计。从Windows XP到Windows Vista,最大的革新就是Windows Aero的引入。
  而在微软的下一代Windows平台Windows 7中,虽然Aero被保留下来,但是Windows 7的图形用户界面更多的是朝着Office 2007相同的方向前进,无论是系统自带的工具软件
  ,例如画图、写字板等,还是上层的第三方应用软件,例如Office 2007、AutoCAD、SnagIt等等,都全面应用了Ribbon界面。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65240-1-1.html 上篇帖子: 助力Windows Phone 7,微软推出APP HUB 下篇帖子: windows phone 7 定位(获取经纬度),然后找到经纬度所在的位置(城市信息)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表