成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

基于Windows 7中的 Ribbon開發技術應用

瀏覽:2日期:2023-05-30 18:04:07

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程序,創建項目工程文件?!?/p>

- 創建一個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是調用每一個命令??纯聪旅娴拿钍荴ML格式。必須返回一個執行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初始化成功返回Turebool LoadMarkup(HINSTANCE hInst,LPCWSTR resourceName);

從資源里加載ribbon,如果現有的ribbon被加載,則釋放它。void DestroyMarkup();銷毀加載的ribbon。int& 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 IDUINT32 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組內的按鈕,你只有三種預定義的方式,安排他們。 這里是一組實例命令:

<Command Name="cmdNew"  LabelTitle="New " Symbol="cmdNew"  Comment="New"  Id="22001"  TooltipTitle="Tooltip Title"  TooltipDescription="Tooltip Text">  <Command.SmallImages> <Image>1-32a.bmp</Image>  </Command.SmallImages> <Command.LargeImages> <Image>1-32a.bmp</Image> </Command.LargeImages> </Command> <Command Name="cmdOpen" LabelTitle="Open "Symbol="cmdOpen" Comment="Open" Id="22002" /> <Command Name="cmdSave" LabelTitle="Save "Symbol="cmdSave" Comment="Save" Id="22003" /> <Command Name="Tab1" LabelTitle="First Tab" Symbol="_44" Id="30001"/> <Command Name="Tab2" LabelTitle="Second Tab" Id="30002"/> <Command Name="cx1" LabelTitle="Check Box 1" /> <Command Name="Font1" LabelTitle="Font Selection1" /> <Command Name="cpick1" LabelTitle="Choose Color" /> <Command Name="cmdn1" LabelTitle="Main Menu" /> <Command Name="g1" LabelTitle="Group 1" />

請注意, "按鈕"命令,將需要的圖片(小16x16 ,或大32x32,或64x64點英寸,但我已經發現,ribbon大的圖像調整得很好) ,但其他的"命令"像標簽標或一組標簽只需要姓名和頭銜,因為沒有命令編號與他們有聯系的。

以下是如何創造一個"應用程序的菜單":

<Ribbon.ApplicationMenu> <ApplicationMenu CommandName="cmdn1"> <MenuGroup Class="MajorItems"> <Button CommandName="cmdNew" /> <Button CommandName="cmdOpen" /> <Button CommandName="cmdSave" /> </MenuGroup> </ApplicationMenu> </Ribbon.ApplicationMenu>

現在,你有一個應用程序的菜單中有三個按鈕:新建,打開,保存。 以下是如何建立快速訪問工具欄:

<Ribbon.QuickAccessToolbar>  <QuickAccessToolbar CustomizeCommandName="cmdCustomize">  <QuickAccessToolbar.ApplicationDefaults>  <Button CommandName="cmdNew" />  </QuickAccessToolbar.ApplicationDefaults>  </QuickAccessToolbar></Ribbon.QuickAccessToolbar>

現在,你有一個快速訪問工具欄的新的內部指令,加上一個按鈕定義的" cmdCustomize "這應該可以自定義快速訪問工具欄。請注意,Ribbon使用戶可以改變按鈕,出現在快速訪問工具欄。

而且,這里是如何創建一個標簽與一些組:

<Ribbon.Tabs> .<Tab CommandName="Tab1" > <Tab.ScalingPolicy> <ScalingPolicy> <ScalingPolicy.IdealSizes> <Scale Group="g1" Size="Large" /> <Scale Group="g2" Size="Large" /> <Scale Group="g3" Size="Large" /> <Scale Group="g4" Size="Large" /> </ScalingPolicy.IdealSizes> </ScalingPolicy> </Tab.ScalingPolicy> <Group CommandName="g1" SizeDefinition="OneButton"> <Button CommandName="cmdNew" /> </Group> <Group CommandName="g2" SizeDefinition="ThreeButtons"> <Button CommandName="cmdNew" /> <Button CommandName="cmdOpen" /> <Button CommandName="cmdSave" /> <DialogLauncher CommandName="cmdSave" /> </Group>  <Group CommandName="g3" SizeDefinition="OneFontControl"> <FontControl CommandName = "Font1"FontType = "RichFont" /> </Group> <Group CommandName="g4"> <DropDownColorPicker CommandName="cpick1" ChipSize = "Large" /> </Group> </Tab>

注意,該標簽已經提到命令" Tab1 "其中包含的標簽名稱。此標簽有四個組,縮放的政策不是任意設置為"大" , "中等"或"小" ,但它依賴于一些控制和布局模板。

這意味著,如果您的組是" OneButton " ,它必須被設置為"大"規模的大小。有一個預定義的一些模板,但你也可以使用<SizeDefinition>定制模板。您可以查看示例的自定義模板。每個小組可以有許多事情,包括按鈕,旋轉按鈕,下拉,字體控制,顏色選擇器,對話框啟動器,分離器,和所有的東西中描述的標記元素網頁。我的上述4組有一些按鈕,字體選擇和顏色選擇器。 我們如何獲得從顏色選擇器值?檢查type == UI_COMMANDTYPE_COLORANCHOR和PROPVARIANT "cv"值包含一個整數,代表的RGB 。我們如何獲得字體選擇值?該類型UI_COMMANDTYPE_FONT和PROPVARIANT "cv"值包含一個IUnknown ,但我還沒有找到如何獲得讓字體!

根據您的應用程序的背景,您可能需要一些標簽和/或組顯示或者隱藏。明確的插入每一個組/標簽,ribbon提供了"應用模式" ,這是一個32位模式的字節設置,他們應該是"active" 。應用模式適用于組和標簽。

例如,這里的定義是在" Tab1 "

<Tab CommandName="Tab1" ApplicationModes="0,2">

這意味著,當位0或2位在當前選定的模式設置,然后在標簽的顯示。因此,當我請Ribbon:: SetModes(0) ,此標簽將會隱藏。當我使用2個或8或任何整數,那么0或2位設置,該標簽將顯示。 同樣可以很容易的適用于程序組。<Group CommandName="g1" SizeDefinition="OneButton" ApplicationModes="3"> 為了獲取/設置ribbon管理的一些狀態,。您可以使用IUIFramework::  GetUICommandProperty獲得一個特殊鍵,或者您也可以查詢"cv" IUnknown成員通過RIBBON_MESSAGE結構的IPropertyStore ;使用GetValue() / SetValue() /提交到讀/寫性能引用控制。還有一些"整體"鍵,您查詢IUIFramework直接的IPropertyStore 。 例如,當我得到通知, WndProc的顏色選擇,它適用于它的背景顏色的ribbon如下:

PROPVARIANT val;// Get the property of the control we pushedHRESULT 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界面。

標簽: Windows系統
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲免费在线看| 国产成人在线看| 国产一区欧美二区| 久久精品系列| 亚洲一区二区精品久久av| 亚洲激情黄色| 欧美国产日产图区| www.日韩大片| 精品三级av在线| 国产在线精品免费| 欧美日韩国产综合久久| 蜜臀久久99精品久久久久久9| 国产三区二区一区久久| 亚洲精品你懂的| 欧美午夜精品| 国产精品女同一区二区三区| 欧美理论在线| 久久久久久久久99精品| 99re视频精品| 久久久久久久一区| 91免费看片在线观看| 久久久久97国产精华液好用吗| 成人国产视频在线观看| 88在线观看91蜜桃国自产| 黄色精品一二区| 91麻豆精品国产91久久久久久久久| 国产一区啦啦啦在线观看| 欧美疯狂性受xxxxx喷水图片| 国产一区二区三区蝌蚪| 欧美美女网站色| 国产美女精品在线| 777亚洲妇女| 成人免费毛片片v| 欧美精品一区视频| 色综合一个色综合| 国产精品久久一级| 99精品欧美| 亚洲电影第三页| 麻豆av一区二区三区| 日本亚洲一区二区| 欧美区在线观看| 成人午夜av影视| 久久精品男人的天堂| 欧美日韩一区二区视频在线| 最新久久zyz资源站| 亚洲激情亚洲| 奇米影视一区二区三区| 91精品国产丝袜白色高跟鞋| 99国产欧美久久久精品| 国产精品国产三级国产普通话三级| 国产亚洲在线| 美女视频一区二区三区| 日韩精品中午字幕| 欧美日韩一区二区三区在线观看免 | 欧美性受xxxx黑人xyx性爽| 国产一区在线看| 久久久www成人免费毛片麻豆| 亚洲午夜精品国产| 日一区二区三区| 这里只有精品99re| 你懂的国产精品| 一区二区三区波多野结衣在线观看| 色先锋aa成人| 成人小视频在线| 国产精品视频一二三| 欧美一级久久| 国产精品中文字幕一区二区三区| 欧美精品一区二区久久久| 精品av久久久久电影| 亚洲v日本v欧美v久久精品| 欧美日韩免费观看一区二区三区| 丁香五精品蜜臀久久久久99网站| 国产精品美女www爽爽爽| 久久av在线| 国产99久久久久| 亚洲视频在线观看一区| 欧美影视一区在线| 99re这里都是精品| 亚洲午夜精品17c| 欧美福利视频导航| 一区在线播放| 美女网站视频久久| 国产欧美日韩精品在线| 久久尤物视频| av不卡免费在线观看| 一区二区三区精品久久久| 欧美色男人天堂| 午夜精品网站| 毛片不卡一区二区| 国产亚洲人成网站| 日本高清成人免费播放| 欧美在线首页| 美女爽到高潮91| 国产精品视频一二三| 欧美亚洲动漫制服丝袜| 欧美成人一品| 久久国产精品无码网站| 亚洲国产成人午夜在线一区| 在线观看亚洲成人| 欧美精品一区二区三区在线看午夜| 日韩激情中文字幕| 国产亚洲精久久久久久| 色噜噜夜夜夜综合网| 欧美91视频| 男女性色大片免费观看一区二区 | 欧美视频一区在线观看| 午夜精彩国产免费不卡不顿大片| 日韩高清一级片| 亚洲国产精品传媒在线观看| 欧美影院精品一区| 1024亚洲| 成人午夜看片网址| 日韩高清中文字幕一区| 日本一区二区综合亚洲| 欧美日韩一区久久| 中文精品在线| 99久久久精品| 久久精品国产99国产精品| 国产精品电影一区二区三区| 欧美丰满美乳xxx高潮www| 国产精品综合| 欧美有码视频| 韩国欧美国产一区| 亚洲午夜成aⅴ人片| 国产日韩欧美不卡| 91精品国产aⅴ一区二区| 国产精品日韩高清| 91视频在线观看免费| 久久精品国产一区二区三区免费看| 亚洲欧洲www| 精品久久久久久久一区二区蜜臀| 欧美影视一区在线| 国产亚洲综合精品| 黄色亚洲免费| av电影在线观看不卡| 国产一区二区中文字幕| 亚洲3atv精品一区二区三区| 国产精品久久久久影视| 精品裸体舞一区二区三区| 精品视频免费看| 久久综合激情| 亚洲国产一区二区在线| 99精品视频一区二区三区| 久久国产精品72免费观看| 亚洲一区二区三区中文字幕 | 国产嫩草一区二区三区在线观看 | 欧美精品少妇一区二区三区 | 欧美日韩激情在线| 一本久久a久久免费精品不卡| 亚洲一级网站| 欧美在线日韩| 成人精品免费视频| 国产一区二区三区免费看 | 欧美日韩国产小视频| 久久久福利视频| 国产精品久久久久久久免费软件| 精品不卡视频| 亚洲欧美亚洲| 99v久久综合狠狠综合久久| 国产成人综合网| 国产一区二区不卡在线| 免费国产亚洲视频| 天堂va蜜桃一区二区三区漫画版| 夜夜精品视频一区二区| 亚洲人123区| 中文成人综合网| 欧美国产精品久久| 国产亚洲综合在线| 精品久久人人做人人爱| 日韩欧美你懂的| 日韩欧美精品三级| 日韩亚洲欧美高清| 91精品中文字幕一区二区三区| 91久久久免费一区二区| 一本色道a无线码一区v| 色老综合老女人久久久| 久久中文在线| 日本高清不卡在线观看| 91精品1区2区| 欧美综合色免费| 欧美日韩中文国产| 欧美日韩性生活| 欧美日韩电影在线| 91精品国产色综合久久| 日韩视频一区二区| 日韩美女天天操| 精品久久久久久最新网址| 久久免费精品国产久精品久久久久| 久久女同性恋中文字幕| 国产精品久久久一本精品| 一区二区三区四区在线| 亚洲制服丝袜一区| 亚洲五码中文字幕| 日本欧美在线观看| 久久成人av少妇免费| 国产91精品精华液一区二区三区| 97精品视频在线观看自产线路二| 欧美午夜国产| 亚洲一区精彩视频| 欧美性受xxxx黑人xyx性爽|