Windows 7 將 Office 2007 風格的 Scenic Ribbon(絲帶介面) 引入系統內建應用(畫圖、書寫板),並提供原生 ActiveX 控制項供第三方開發者使用。本文詳細解析 Ribbon 架構、XML 定義、命令處理機制、應用程式模式,並提供 C++ 實作範例與封裝類庫設計思路。
intentcl.exe 將 XML 編譯為二進位資源IUIFramework 介面:CoCreateInstance(CLSID_ScenicIntentUIFramework, ...)IUIApplication 介面(三個關鍵方法):
OnCreateUICommand:命令建立時回呼,傳回 IUICommandHandlerOnDestroyUICommand:命令銷毀時通知OnViewChanged:Ribbon 視圖建立/大小變更時通知,可查詢 IUIRibbon 取得預期高度IUIFramework::Initialize(hwnd, pUIApplication)IUIFramework::LoadUI(hInstance, resourceName) 載入編譯後資源IUICommandHandler 實作UpdateProperty:屬性更新(啟用/停用、顯示/隱藏、圖示切換…)Execute:命令執行(按鈕點擊、下拉選擇、字體/顏色變更…)OnDestroyUICommand 僅通知銷毀,不呼叫 Release(),框架自行管理生命週期<Command Name="cmdNew" LabelTitle="New" Symbol="cmdNew" Comment="New" Id="22001"
TooltipTitle="Tooltip" TooltipDescription="Text">
<Command.SmallImages><Image>1-32a.bmp</Image></Command.SmallImages>
<Command.LargeImages><Image>1-32a.bmp</Image></Command.LargeImages>
</Command>
<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>
<Ribbon.Tabs>
<Tab CommandName="Tab1">
<Tab.ScalingPolicy>
<ScalingPolicy>
<ScalingPolicy.IdealSizes>
<Scale Group="g1" Size="Large"/>
<Scale Group="g2" 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>
</Ribbon.Tabs>
SizeDefinition 決定佈局模板(OneButton、ThreeButtons、OneFontControl…)32 位元位遮罩控制索引標籤/群組顯示/隱藏:
<Tab CommandName="Tab1" ApplicationModes="0,2"> // 模式 0 或 2 位元為 1 時顯示
<Group CommandName="g1" ApplicationModes="3"> // 模式 0 和 1 位元為 1 時顯示
執行期呼叫 Ribbon::SetModes(mask) 切換模式。
IUIFramework::GetUICommandProperty / SetUICommandProperty 存取命令屬性IPropertyStore 介面管理屬性集,支援 UI_PKEY_GlobalBackgroundColor 等全域鍵值class RIBBON {
RIBBON(HWND h = 0); ~RIBBON();
bool Initialize();
bool LoadMarkup(HINSTANCE hInst, LPCWSTR resourceName);
void DestroyMarkup();
int& DesiredHeight();
void SetHeight(int);
// 訊息轉發至 WM_COMMAND 範例
};
訊息結構 RIBBON_MESSAGE 封裝所有回呼參數,統一透過 RegisterWindowMessage 轉發。
Ribbon 取代傳統選單成為新標準介面。Win 7 系統級支援意味著開發者必須掌握:XML 定義、命令處理、視圖同步、模式切換、屬性存取。善用封裝類庫可大幅降低接入複雜度,專注於業務邏輯實作。


