首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

打造 Office 2003 風格選單元件:一鍵套用專業 UI 風格

     編輯:關於C#

元件特色

  • 單行程式碼為所有選單與右鍵選單套用 Office 2003 風格。
  • 支援為選單項目加入圖示。
  • 呼叫 End() 即可還原原生風格。

Office 2003 風格選單效果圖

使用步驟

  1. 將元件 (OfficeMenus.dll) 加入工具箱。
  2. 拖曳至表單,產生 OfficeMenus1 元件實例。
  3. 啟用風格:OfficeMenus1.Start(this);
  4. 停用風格:OfficeMenus1.End();
  5. 加入圖示:
    OfficeMenus1.ImageList = imageList1;
    OfficeMenus1.AddPicture(menuItem2, 1);

實作原理深度解析

核心架構:三大類別

  • OfficeMenus:繼承 Component,管理全域設定與生命週期。
  • MainMenuItemDrawing:繪製頂層選單列(如「檔案」、「編輯」)。
  • MenuItemDrawing:繪製子選單與右鍵選單項目。

命名空間:Dev4Arabs

關鍵資料結構

static ImageList _imageList; // 圖示集合
static NameValueCollection picDetails = new NameValueCollection(); 
// 對應:選單控制碼 Handle → 圖示索引

Start() 核心邏輯

  1. 取得表單 MainMenu 與 ContextMenu。
  2. 遞迴遍歷所有 MenuItem:
foreach (MenuItem mi in menu.MenuItems)
{
    mi.MeasureItem += MainMenuItem_MeasureItem;
    mi.DrawItem += MainMenuItem_DrawItem;
    mi.OwnerDraw = true; // 關鍵:啟用自繪
    InitMenuItem(mi);    // 遞迴處理子選單
}
  1. 對表單與所有子控制項的 ContextMenu 同樣處理。

自繪機制 (OwnerDraw)

設定 OwnerDraw = true 後,Windows 會發送兩個關鍵事件:

  • MeasureItem:計算選單項目寬高(對應 Win32 WM_MEASUREITEM)。
  • DrawItem:實際繪製外觀(對應 Win32 WM_DRAWITEM)。

繪製細節分工

類別負責範圍關鍵方法
MainMenuItemDrawing主選單列項目DrawMenuItem():繪製懸浮/選取矩形、文字
MenuItemDrawing子選單、右鍵選單DrawMenuItem():繪製背景、核取方塊、文字、圖示

圖示管理

public void AddPicture(MenuItem mi, int index)
{
    picDetails.Add(mi.Handle.ToString(), index.ToString());
}

public static Bitmap GetItemPicture(MenuItem mi)
{
    if (_imageList == null) return null;
    string[] idx = picDetails.GetValues(mi.Handle.ToString());
    return idx == null ? null : (Bitmap)_imageList.Images[Convert.ToInt32(idx[0])];
}

技術心得

.NET GDI+ 讓自繪比 MFC/Win32 簡單許多。難點在於 MeasureItem/DrawItem 事件中依據狀態(懸浮、選取、分隔線、核取方塊、圖示區域)進行精確繪製。完整原始碼可參考 CodeProject 專案 MhOffice2003Menus。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved