Windows Ribbon 框架為傳統 Win32 桌面應用帶來 Office 風格的現代化命令介面。其核心架構採用 標記與程式碼分離:XML 定義結構、控制項組織與資源;C++ COM 介面負責初始化與事件處理。這種分離讓 UI 設計與業務邏輯獨立演進,大幅降低維護成本。
RibbonAppribbonmarkup.xml,定義最小功能區結構:<Application xmlns="https://schemas.microsoft.com/windows/2009/Ribbon">
<Application.Commands>
<Command Name="TabHome" Symbol="cmdTabHome" Id="30000" />
</Application.Commands>
<Application.Views>
<Ribbon>
<Ribbon.Tabs>
<Tab CommandName="TabHome" />
</Ribbon.Tabs>
</Ribbon>
</Application.Views>
</Application>
對 ribbonmarkup.xml 設定自訂建置步驟:
命令列: uicc.exe ribbonmarkup.xml ribbonmarkup.bml /res:ribbonres.rc
輸出: ribbonmarkup.bml;ribbonres.rc
uicc.exe 將 XML 編譯為二進位標記 (.bml) 與資源腳本 (.rc),再將 #include "ribbonres.rc" 加入專案 .rc 檔。
Ribbon.cpp 實作 IUIApplication 介面(三方法暫回傳 E_NOTIMPL)IUIFramework* g_pFramework,InitRibbon(HWND) 執行:
CoCreateInstance(CLSID_UIRibbonFramework) 取得框架指標CApplication 物件g_pFramework->Initialize(hWnd, pApplication)g_pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_RIBBON")_tWinMain 初始化 COM、呼叫 InitRibbon、WM_DESTROY 時呼叫 DestroyRibbon(Destroy() + Release())WS_CLIPCHILDREN 消除調整大小時閃爍<Application.Commands> 新增 GroupMain、MyButton 命令<Tab> 內新增 <Group> 與 <Button>ribbonres.h(/header:ribbonres.h),包含命令符號定義LabelTitle、TooltipTitle/Description、LargeImagesCApplication 繼承 IUICommandHandlerExecute:判斷 nCmdID == cmdMyButton 彈出訊息方塊OnCreateUICommand 對特定命令回傳 QueryInterface 指標標記中將 <CheckBox> 改為 <ToggleButton>,C++ 程式碼完全不用修改,因兩者命令類型相同。
為 GroupMain 加入 SizeDefinition="TwoButtons",大按鈕並排顯示。
BOOL _fEnabled 狀態旗標Execute 中透過 GetUICommandProperty/SetUICommandProperty 切換 UI_PKEY_Enabled 屬性propsys.lib 使用屬性輔助 APIUpdateProperty:當 key == UI_PKEY_Label 時依狀態回傳「啟用按鈕」/「停用按鈕」InvalidateUICommand 觸發標籤重繪GroupDatabase(三大按鈕)、GroupClipboard(大按鈕+小按鈕組合)ControlGroup 組織小按鈕LargeImages/SmallImages)<Tab.ScalingPolicy>
<ScalingPolicy>
<ScalingPolicy.IdealSizes>
<Scale Group="GroupMain" Size="Large"/>
<Scale Group="GroupDatabase" Size="Large"/>
<Scale Group="GroupClipboard" Size="Large"/>
</ScalingPolicy.IdealSizes>
<Scale Group="GroupClipboard" Size="Medium"/>
<Scale Group="GroupClipboard" Size="Popup"/>
<Scale Group="GroupDatabase" Size="Medium"/>
</ScalingPolicy>
</Tab.ScalingPolicy>
行為:視窗縮小時,Clipboard 群組優先縮小(標籤消失→彈出式),Database 群組轉小按鈕垂直排列,最終功能區自動隱藏騰出工作區空間。
GroupClipboard 指定大圖示SmallImages (16x16) 避免大圖縮放失真本教程完整展示 Windows Ribbon 框架的標記/程式碼分離架構、命令與控制項解耦設計、資源管理、事件處理與自適應佈局機制。掌握這些核心概念,即可為傳統桌面應用快速打造專業級的現代化命令介面。