首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Visual C++ 自繪選單完整實作:圖示、狀態回饋與垂直位圖支援

     編輯:VC 教學

為什麼需要 Owner-Draw Menu?

MFC AppWizard 產生的標準選單僅支援純文字,現代應用需求:圖示、熱追蹤高亮、灰色停用、核取標記等,皆需自行繪製。

核心機制:兩個虛擬函式

函式用途關鍵結構
MeasureItem告知系統選單項目寬高MEASUREITEMSTRUCT
DrawItem實際繪製圖示、文字、背景、狀態效果DRAWITEMSTRUCT

DRAWITEMSTRUCT 關鍵欄位解析

  • CtlType == ODT_MENU 確認為選單項目
  • itemID:選單項目命令 ID
  • itemAction:ODA_DRAWENTIRE 全部重繪、ODA_SELECT 選取狀態變化、ODA_FOCUS 焦點變化
  • itemState 組合旗標:ODS_SELECTED、ODS_GRAYED、ODS_DISABLED、ODS_HOTLIGHT(滑鼠懸停)、ODS_CHECKED 等
  • hDC:繪圖裝置內容
  • rcItem:項目矩形區域(座標原點為選單左上角,需自行換算)
  • itemData:攜帶自訂資料(圖示控制碼、文字指標等),由 AppendMenu/InsertMenu/ModifyMenu 傳入

CMenuEx 類別架構設計

class CMenuEx : public CMenu
{
public:
    // 主介面:依工具列按鈕自動建立圖示對應
    void InitMenu(CMenu* pMenu, UINT uToolBar, CToolBar* pToolBar);
    // 垂直左側位圖(如 Windows 開始選單)
    void SetImageLeft(UINT idBmpLeft);
    // 右鍵彈出式選單專用
    void InitPopupMenu(CMenu* pMenu, UINT uToolBar, CToolBar* pToolBar);
    // 從工具列按鈕提取圖示
    int GetImageFromToolBar(UINT uToolBar, CToolBar* pToolBar, COLORREF crMask);

protected:
    virtual void MeasureItem(LPMEASUREITEMSTRUCT lpMIS);
    virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS);
};

實作要點

  1. 啟用 Owner-Draw: ModifyMenu(id, MF_BYCOMMAND | MF_OWNERDRAW, id, (LPCTSTR)itemData) 或建立時 AppendMenu(MF_OWNERDRAW | MF_STRING, id, (LPCTSTR)itemData)。
  2. MeasureItem: 依字型高度、圖示寬度填入 itemWidth/itemHeight。
  3. DrawItem:
    • 依 itemState 選擇背景筆刷(選取藍底、停用灰底、熱追蹤淡藍)
    • 繪製核取標記(ODS_CHECKED)
    • 從 itemData 取得圖示控制碼,DrawIconEx 繪製
    • DrawText 繪製文字,支援快捷鍵底線(DT_HIDEPREFIX)
    • 若 SetImageLeft 設定垂直位圖,在左側畫區塊填滿
  4. 圖示來源: 掃描工具列按鈕,ID 相符者取其圖示;無對應則不畫圖示。

使用範例

// 主框架 OnCreate 中
m_menuEx.InitMenu(&m_wndMenuBar, IDR_MAINFRAME, &m_wndToolBar);
m_menuEx.SetImageLeft(IDB_BITMAP_LEFT); // 可選:垂直位圖

// 右鍵選單
CMenuEx* pPopup = new CMenuEx;
pPopup->InitPopupMenu(pMenu, IDR_POPUP, &m_wndToolBar);
pPopup->TrackPopupMenu(TPM_LEFTALIGN, x, y, this);

進階擴充方向

  • 支援圖示動畫(GIF/多幀位圖)
  • 整合主題引擎(Office 2007/2010/Windows 10 風格)
  • 鍵盤導航視覺強化(焦點虛線框、快捷鍵提示)
  • 高 DPI 縮放支援(GetDpiForWindow + 向量圖示)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved