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

CMenuEx 自繪選單類:仿 QQ 風格漸層選單,支援主選單/彈出選單/縱向圖示欄/顏色客製化

     編輯:VC 教學

受 QQ 經典選單風格啟發,作者開發了 CMenuEx 類別,提供 **漸層背景、選中高亮、文字陰影、縱向圖示欄 (像 Windows 開始選單)、主選單與彈出選單統一介面** 等功能。本文詳細說明介面函數、使用步驟、資源匹配技巧與顏色設定。

效果展示

核心介面函數

函數用途
InitMenu(CMenu*, UINT uToolBar, CToolBar*)主選單初始化 (於 OnInitMenu 調用),需工具列物件取得按鈕圖示
SetHighLightColor(COLORREF)設定選中項目文字色 (建議 RGB(0,0,127) 深藍)
SetBackColor(COLORREF)設定選單背景色 (建議 RGB(143,167,207) 淺藍灰)
SetTextColor(COLORREF)設定一般文字色 (建議 RGB(0,0,0) 黑)
SetImageLeft(UINT uBmpID)設定左側縱向圖示欄位圖 (寬高比例需配合選單高度)
InitPopupMenu(CMenu*, UINT, CToolBar*)彈出選單初始化 (含一級選單),於 WM_INITMENUPOPUP 調用
DrawItem / MeasureItem繪製/測量核心虛函數,需在框架 OnDrawItem/OnMeasureItem 中轉發
TrackPopupMenu(...)追蹤顯示彈出選單 (右鍵選單等)
CreatePopupMenu / AppendMenu / DestroyMenu動態建立彈出選單標準流程

使用步驟:主框架選單 (3 步)

  1. 成員變數:CMenuEx m_menu;
  2. OnInitMenu:m_menu.InitMenu(pMenu, IDR_MAINFRAME, &m_wndToolBar);
  3. 轉發繪製訊息:
    void CMainFrame::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDIS) 
    { if (!nIDCtl) m_menu.DrawItem(lpDIS); }
    void CMainFrame::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMIS) 
    { if (!nIDCtl) m_menu.MeasureItem(lpMIS); }

注意: 工具列位圖按鈕數量必須與選單項 ID 一一對應,否則圖示會錯位。刪除多餘位圖或補齊選單項即可修正。

啟用縱向圖示欄 (像開始選單)

OnCreate 中:m_menu.SetImageLeft(IDB_BITMAP_LEFT); (需準備合適寬高比位圖)。

使用步驟:視圖類別彈出選單 (右鍵選單)

  1. CChildView 成員:CMenuEx m_menu; CToolBar* m_pToolBar;
  2. 指標賦值:CMainFrame* pF = (CMainFrame*)AfxGetMainWnd(); m_pToolBar = &pF->m_wndToolBar; (需將工具列改 public)。
  3. 建構函數動態建立選單:
    m_menu.CreatePopupMenu();
    m_menu.AppendMenu(0, ID_EDIT_UNDO, _T("復原"));
    m_menu.AppendMenu(MF_SEPARATOR);
    m_menu.AppendMenu(0, ID_EDIT_COPY, _T("複製"));
    m_menu.AppendMenu(0, ID_EDIT_CUT, _T("剪下"));
    m_menu.AppendMenu(0, ID_EDIT_PASTE, _T("貼上")); // ID 與工具列按鈕一致才顯示圖示
  4. 解構函數:m_menu.DestroyMenu();
  5. WM_INITMENUPOPUP:if (!bSysMenu) m_menu.InitPopupMenu(pPopupMenu, IDR_MAINFRAME, m_pToolBar);
  6. WM_CONTEXTMENU:m_menu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, pt.x, pt.y, this);

顏色設定範例 (QQ 風格)

m_menu.SetHighLightColor(RGB(0, 0, 127));   // 選中深藍字
m_menu.SetTextColor(RGB(0, 0, 0));          // 一般黑字
m_menu.SetBackColor(RGB(143, 167, 207));    // 背景淺藍灰

關鍵限制

  • 單一 CMenuEx 實例 **只能調用 InitMenu 或 InitPopupMenu 其中之一**,不可混用。
  • 子選單的彈出選單未自動設為 Owner-Draw,需自行遞迴處理 (作者建議擴展)。
  • 「最近使用檔案」動態選單項需特殊處理。

這個類別雖非完整框架級方案,但介面清晰、核心繪製邏輯 (漸層、圖示欄、高亮) 具備參考價值,適合整合至專案自有 UI 庫中。

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