Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Windows 7 Ribbon 介面開發技術深度解析:Scenic Ribbon 控制項、XML 定義、命令處理、應用程式模式完整實作指南

編輯:Win7 系統基礎知識

Windows 7 將 Office 2007 風格的 Scenic Ribbon(絲帶介面) 引入系統內建應用(畫圖、書寫板),並提供原生 ActiveX 控制項供第三方開發者使用。本文詳細解析 Ribbon 架構、XML 定義、命令處理機制、應用程式模式,並提供 C++ 實作範例與封裝類庫設計思路。

Ribbon 核心架構

  • 單一 ActiveX 控制項附加於視窗,寬度隨視窗、高度可配置
  • 資料來源:XML 標記 定義所有命令、索引標籤、群組、控制項
  • 編譯工具:intentcl.exe 將 XML 編譯為二進位資源

初始化流程

  1. 建立 IUIFramework 介面:CoCreateInstance(CLSID_ScenicIntentUIFramework, ...)
  2. 實作 IUIApplication 介面(三個關鍵方法):
    • OnCreateUICommand:命令建立時回呼,傳回 IUICommandHandler
    • OnDestroyUICommand:命令銷毀時通知
    • OnViewChanged:Ribbon 視圖建立/大小變更時通知,可查詢 IUIRibbon 取得預期高度
  3. IUIFramework::Initialize(hwnd, pUIApplication)
  4. IUIFramework::LoadUI(hInstance, resourceName) 載入編譯後資源

命令處理器

  • 每個命令對應一個 IUICommandHandler 實作
  • 兩個核心方法:
    • UpdateProperty:屬性更新(啟用/停用、顯示/隱藏、圖示切換…)
    • Execute:命令執行(按鈕點擊、下拉選擇、字體/顏色變更…)
  • OnDestroyUICommand 僅通知銷毀,不呼叫 Release(),框架自行管理生命週期

XML 定義關鍵要素

命令定義

<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>
  • 按鈕需提供 16×16/32×32 圖示;索引標籤/群組僅需 Name/LabelTitle

應用程式選單

<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…)
  • 縮放原則依賴預定義模板,非任意 Large/Medium/Small

應用程式模式

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 等全域鍵值
  • 範例:顏色選擇器變更時,將選取顏色套用為 Ribbon 背景色

封裝類庫設計

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 定義、命令處理、視圖同步、模式切換、屬性存取。善用封裝類庫可大幅降低接入複雜度,專注於業務邏輯實作。

Ribbon 介面範例

Ribbon 架構圖

實作步驟圖解

Copyright © Windows教程網 All Rights Reserved