亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

基于Windows 7中的 Ribbon開發(fā)技術(shù)應(yīng)用

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

Windows 7的畫圖工具采用了微軟所稱的Scenic Ribbon 界面,這種界面起初是在Office 2007中出現(xiàn)的,也在WordPad出現(xiàn)過。雖然很多用戶還在抱怨"不習(xí)慣Ribbon界面"、"很多功能找不到位置"等等,但是,隨著微軟的"強(qiáng)制" 推行,Ribbon界面也在越來越被人們所接受, 很多應(yīng)用軟件也開始采用Ribbon界面。更重要的是,在即將到來的Windows 7中,操作系統(tǒng)本身更是大量地應(yīng)用了Ribbon界面。不管我們?cè)敢饣蛘卟辉敢猓琑ibbon界面開始大張旗鼓地攻占我們的軟件界面,成為繼下拉式菜單后新的標(biāo)準(zhǔn)用戶界面。作為用戶,我們需要逐漸熟悉這種新的軟件用戶界面;而作為開發(fā)者,更是需要了解和認(rèn)識(shí)這種新的軟件用戶界面,新的交互方式,從而利于這種新界面的優(yōu)勢(shì),為用戶提供更加優(yōu)秀的軟件。"Ribbon來了!"

為了支持開發(fā)人員,微軟正在確保其設(shè)備驅(qū)動(dòng)程序和應(yīng)用模式在 Vista和Windows 7 之間不變,以確保其兼容性。但是公司正在努力工作使開發(fā)人員接觸Windows 7的新技術(shù),以使他們能夠在他們自己的解決方案中應(yīng)用一些新的高級(jí)特性。這包括諸如Jump Lists,PowerShell(《Windows Powershell應(yīng)用編程最佳實(shí)踐》此書我正在編寫中6月左右出版),"畫圖"的Scenic Ribbon control以及寫字板,以及其它的組件。

在Office 2007之后介紹了這個(gè)Scenic Ribbon.許多昂貴的商業(yè)解決方案都已經(jīng)用到它。但最后,在即將推出的Windows 7,微軟推出了Scenic Ribbon.在這里我第一次嘗試在實(shí)例中使用從而在這里講解出來。Scenic Ribbon是一個(gè)在ActiveX對(duì)象附加在窗口上,它的整個(gè)寬度的窗口,它的高度可配置的。它的尺寸會(huì)根據(jù)你的需要而調(diào)整。Ribbon從一個(gè)XML 中獲得顯示數(shù)據(jù)。這意味著您只使用幾個(gè)函數(shù)調(diào)用,一些初始化并加載數(shù)據(jù),以及一個(gè)意外事件處理程序觸發(fā)Ribbon。由于Ribbon是一個(gè) ActiveX界面,應(yīng)用程序在XP或Vista下使用會(huì)初始化失敗,但它會(huì)繼續(xù)運(yùn)行。當(dāng)創(chuàng)建的XML時(shí),運(yùn)行intentcl.exe程序,創(chuàng)建項(xiàng)目工程文件。 

- 創(chuàng)建一個(gè)IUIFramework

IUIFramework* u_f = 0;HRESULT hr = CoCreateInstance(CLSID_ScenicIntentUIFramework, 0,CLSCTX_ALL,__uuidof(IUIFramework),(void**)&u_f);

- 執(zhí)行一個(gè)IUIApplication

這個(gè)界面(除了IUnknown成員)有以下三個(gè)功能:

1、當(dāng)一個(gè)命令創(chuàng)建時(shí)調(diào)用ribbon:

virtual HRESULT __stdcall OnCreateUICommand(UINT32 commandId,UI_COMMANDTYPE typeID,IUICommandHandler **commandHandler);

2、當(dāng)ribbon被一個(gè)命令是釋放時(shí):

virtual HRESULT __stdcall OnDestroyUICommand(UINT32 commandId, UI_COMMANDTYPE typeID,IUICommandHandler *commandHandler);

3、當(dāng)ribbon變化時(shí),視圖也被相應(yīng)的改變:

virtual HRESULT __stdcall OnVIEwChanged(UINT32 viewId,UI_VIEWTYPE typeID, IUnknown *view,UI_VIEWVERB verb,INT32 uReasonCode);

-調(diào)用IUIFramework::Initialize( )與父窗口的ribbon,和執(zhí)行IUIApplication 。 -調(diào)用IUIFramework::LoadUI( )與HINSTANCE和資源名稱。

下面的圖解釋了需要采取的步驟,以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Ribbon應(yīng)用。

命令處理程序OnCreateUICommand是調(diào)用每一個(gè)命令。看看下面的命令是XML格式。必須返回一個(gè)執(zhí)行IUICommandHandler(AddRef ()+!)將處理命令兩個(gè)成員函數(shù):

HRESULT __stdcall UpdateProperty(UINT32 commandId,REFPROPERTYKEY key,const PROPVARIANT *currentValue,PROPVARIANT *newValue);

當(dāng)命令調(diào)用執(zhí)行時(shí)。這個(gè)"verb"是UI_EXECUTIONVERB枚舉,并通知您,觸發(fā)什么樣的事件,例如,字體選擇下拉,一個(gè)按鈕按下等使用OnDestroyUICommand時(shí),將沒有必要了調(diào)用接口,但不調(diào)用Release() 。Ribbon將調(diào)用它。這只是通知你的目的是要被銷毀,而不是請(qǐng)求釋放它自己。

nVIEwChanged允許從 IUIFramework和查詢其狀態(tài)請(qǐng)求一個(gè)接口。如果typeId == UI_VIEWTYPE_RIBBON和verb== UI_VIEWVERB_CREATE或UI_VIEWVERB_SIZE 例如,這會(huì)告訴你,ribbon創(chuàng)建或改變大小,這樣你就可以查詢IUnknown指針的IUIRibbon并獲得其預(yù)期的高度。

為了避免上述所有的問題,把這些接口包裝到類庫(kù)。一個(gè)RIBBON類,并且你使用如下:

RIBBON(HWND hh = 0);~RIBBON();bool Initialize();

Ribbon初始化成功返回Ture

bool LoadMarkup(HINSTANCE hInst,LPCWSTR resourceName);

Ribbon初始化成功返回Turebool LoadMarkup(HINSTANCE hInst,LPCWSTR resourceName);

從資源里加載ribbon,如果現(xiàn)有的ribbon被加載,則釋放它。void DestroyMarkup();銷毀加載的ribbon。int& DesiredHeight();

返回理想高度ribbonvoid SetHeight(int);允許設(shè)置ribbon高度

調(diào)用類庫(kù)向父窗口發(fā)送一個(gè)預(yù)定義的MESSAGE_RIBBON (const int MESSAGE_RIBBON = RegisterWindowMessage(L"{E733E4DA-904C-486b-B5FB-6201773D69DE}");),與 WPARAM設(shè)置為RIBBON *類,和LPARAM設(shè)置為RIBBON_MESSAGE結(jié)構(gòu):

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數(shù)據(jù)格式由于ribbon本質(zhì)上是一個(gè)代表性的一個(gè)XML地圖,在這里您將實(shí)際花費(fèi)大部分的時(shí)間來制定一個(gè)好的和工作ribbon.。

ribbon 基本要素:一套命令,每個(gè)人可以有一個(gè)ID,一個(gè)符號(hào),一個(gè)標(biāo)簽,一個(gè)提示,和一套圖像。您定義這些命令為"按鈕"和其他因素,如標(biāo)簽或一組標(biāo)簽。一套要素,包括一個(gè)"應(yīng)用程序的菜單" ,一個(gè)"快速訪問工具欄"和"ribbon" ,其中載有一些標(biāo)簽。每個(gè)標(biāo)簽可以有一些組,每個(gè)組都可以有一些預(yù)定義的控制。

這些組都必須標(biāo)明具體的"大小"和布局;所以舉例來說,如果你想說, 6組內(nèi)的按鈕,你只有三種預(yù)定義的方式,安排他們。 這里是一組實(shí)例命令:

<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" />

請(qǐng)注意, "按鈕"命令,將需要的圖片(小16x16 ,或大32x32,或64x64點(diǎn)英寸,但我已經(jīng)發(fā)現(xiàn),ribbon大的圖像調(diào)整得很好) ,但其他的"命令"像標(biāo)簽標(biāo)或一組標(biāo)簽只需要姓名和頭銜,因?yàn)闆]有命令編號(hào)與他們有聯(lián)系的。

以下是如何創(chuàng)造一個(gè)"應(yīng)用程序的菜單":

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

現(xiàn)在,你有一個(gè)應(yīng)用程序的菜單中有三個(gè)按鈕:新建,打開,保存。 以下是如何建立快速訪問工具欄:

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

現(xiàn)在,你有一個(gè)快速訪問工具欄的新的內(nèi)部指令,加上一個(gè)按鈕定義的" cmdCustomize "這應(yīng)該可以自定義快速訪問工具欄。請(qǐng)注意,Ribbon使用戶可以改變按鈕,出現(xiàn)在快速訪問工具欄。

而且,這里是如何創(chuàng)建一個(gè)標(biāo)簽與一些組:

<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>

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

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

根據(jù)您的應(yīng)用程序的背景,您可能需要一些標(biāo)簽和/或組顯示或者隱藏。明確的插入每一個(gè)組/標(biāo)簽,ribbon提供了"應(yīng)用模式" ,這是一個(gè)32位模式的字節(jié)設(shè)置,他們應(yīng)該是"active" 。應(yīng)用模式適用于組和標(biāo)簽。

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

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

這意味著,當(dāng)位0或2位在當(dāng)前選定的模式設(shè)置,然后在標(biāo)簽的顯示。因此,當(dāng)我請(qǐng)Ribbon:: SetModes(0) ,此標(biāo)簽將會(huì)隱藏。當(dāng)我使用2個(gè)或8或任何整數(shù),那么0或2位設(shè)置,該標(biāo)簽將顯示。 同樣可以很容易的適用于程序組。<Group CommandName="g1" SizeDefinition="OneButton" ApplicationModes="3"> 為了獲取/設(shè)置ribbon管理的一些狀態(tài),。您可以使用IUIFramework::  GetUICommandProperty獲得一個(gè)特殊鍵,或者您也可以查詢"cv" IUnknown成員通過RIBBON_MESSAGE結(jié)構(gòu)的IPropertyStore ;使用GetValue() / SetValue() /提交到讀/寫性能引用控制。還有一些"整體"鍵,您查詢IUIFramework直接的IPropertyStore 。 例如,當(dāng)我得到通知, 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鍵。

總結(jié):隨著Windows平臺(tái)的發(fā)展升級(jí),往往都伴隨著系統(tǒng)圖形界面的重新設(shè)計(jì)。從Windows XP到Windows Vista,最大的革新就是Windows Aero的引入。

而在微軟的下一代Windows平臺(tái)Windows 7中,雖然Aero被保留下來,但是Windows 7的圖形用戶界面更多的是朝著Office 2007相同的方向前進(jìn),無論是系統(tǒng)自帶的工具軟件,例如畫圖、寫字板等,還是上層的第三方應(yīng)用軟件,例如Office 2007、AutoCAD、SnagIt等等,都全面應(yīng)用了Ribbon界面。

標(biāo)簽: Windows系統(tǒng)
相關(guān)文章:
主站蜘蛛池模板: 国产精品美乳免费看 | 中文在线 | 中文 | 亚洲免费色图 | 黄色1级 | 国产女人的一级毛片视频 | 91中文在线| 免费特黄一级欧美大片 | 国产一区二区三区波多野吉衣 | 亚洲免费一区二区 | 91久久精品午夜一区二区 | 国模私拍福利视频在线透漏 | 在线免费观看网站 | 欧美另类色图 | 国产一区在线免费观看 | 久久精品a亚洲国产v高清不卡 | 欧美性一级交视频 | 91专区在线观看 | 国产免费a级片 | 精品久久久久亚洲 | 综合啪啪| 免费毛片视频 | 国产在线爱做人成小视频 | 国产精品一区二区三区四区五区 | 三黄色 | 一级特黄国产高清毛片97看片 | 黄网址在线永久免费观看 | 欧美国产亚洲一区二区三区 | 国产成人综合久久精品亚洲 | 国产农村精品一级毛片视频 | 91免费网 | 成年人视频黄色 | 国精产品一区一区三区 | 久久久精品午夜免费不卡 | 日本欧美一区二区三区免费不卡 | 国产精品亚洲精品日韩已方 | 91精品国产调教在线观看 | 黄色一级在线观看 | 色性综合| 中文字幕在线播放视频 | 免费国产黄网站在线观看视频 | 91最新入口|