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

打造專業級 MFC 開始選單/彈出選單庫:支援分組、圖示、熱鍵、自定焦點樣式與 Left Bar

     編輯:關於VC++

前言

Windows XP 風格的「開始選單」(分組式/經典式)與 Vista 風格選單,以其豐富的視覺層次、鍵盤/滑鼠雙模操作、極高的自定義彈性,成為專業軟體主選單的標桿。本文介紹一款封裝完善的 MFC 選單類別庫 CYisongStartMenu,功能涵蓋 XP 兩種模式、托盤選單、右鍵快捷選單,支援自定義背景圖、焦點高亮條、Left Bar、Check/Radio 項目、熱鍵與方向鍵導航。

一、核心特性

分類功能
項目管理AppendProgItem:左側程式清單項目(支援子選單彈出)
AppendPlaceItem:右側常用位置/分組項目
AppendBottomItem:底部功能列(關機、登出等)
視覺自定頂部使用者欄:文字、圖示、背景圖 (多張輪播)
項目文字顏色、焦點高亮圖 (支援自定義位圖、任意尺寸)
Left Bar 風格、底部背景圖
互動增強滑鼠點選、懸停、方向鍵上下左右、熱鍵 (Alt+字母)
Check/Radio 樣式、分隔線、動態增刪項目

二、快速上手:三步驟整合

1. 複製檔案至專案目錄

YisongStartMenu.dll / .lib
MyStartMenuLib.h, MyStartMenu.h, CmyToolTipCtrl.h

2. 引入標頭並宣告成員

#include "MyStartMenuLib.h"
class CMyDlg : public CDialog {
    CYisongStartMenu m_StartMenu;
    // ...
};

3. 初始化與建立選單結構(於 OnInitDialog 或按鈕事件中)

// 1. 使用者頂部欄
_TextInfo ti; m_StartMenu.GetUserPaneTextInfo(ti);
ti.clrShadow = GetSysColor(COLOR_BTNSHADOW);
ti.nOffsetX = 1; ti.nOffsetY = 1;
ti.logFontUserText.lfItalic = TRUE;
m_StartMenu.SetUserPaneTextInfo(ti);
m_StartMenu.SetUserPaneText(_T("WindowXp Menu"));
m_StartMenu.SetUserPaneIcon(IDI_ICON_QQ, CSize(48,48));
m_StartMenu.GetUserBitmap(0, _T(".\\skin\\1.bmp"));
m_StartMenu.GetUserBitmap(1, _T(".\\skin\\2.bmp"));
m_StartMenu.GetUserBitmap(2, _T(".\\skin\\3.bmp"));

// 2. 左側程式清單
m_StartMenu.AppendProgItem(_T("Internet\nInternet Explorer"), ID_PROGLIST_IE, 0, MENU_DEFAULT, IDI_ICON_IE, NULL, _T("連接國際互聯網頁"));
// ... 更多項目 ...
m_StartMenu.AppendProgItem(_T("所有程式"), IDR_MENU_TEST, 0, MENU_BOTTOM|MENU_POPUP, 0, NULL, NULL, &m_wndSubMenu);

// 3. 右側分組清單
m_StartMenu.AppendPlaceItem(_T("My Documents"), ID_PLACELIST_MYDOCUMENT, 0, MENU_DEFAULT, IDI_ICON_MYDOCUMENT);
// ...

// 4. 視覺微調
m_StartMenu.SetItemTextColor(PLACELIST_TYPE, RGB(0,255,0));
m_StartMenu.SetItemFoucsBitmap(PLACELIST_TYPE, _T(".\\skin\\OverFoucs.bmp"));

// 5. 底部列
CImageList lst; lst.Create(IDB_STARTPANE_BUTTONS, 24, 3, RGB(192,192,192));
m_StartMenu.AppendBottomItem(_T("關機"), ID_BOTTOMBAR_TURNOFF, 0, MENU_NORMAL, 0, lst.ExtractIcon(2));
m_StartMenu.AppendBottomItem(_T("登出"), ID_BOTTOMBAR_LOGOFF, 0, MENU_NORMAL, 0, lst.ExtractIcon(1));
m_StartMenu.GetBottomBarBitmap(0, _T(".\\skin\\1.bmp"));
// ...

// 6. 彈出顯示
CPoint pt; GetCursorPos(&pt);
m_StartMenu.TrackPopPane(pt.x, pt.y, m_hWnd, 0);

三、命令回應:標準 WM_COMMAND 映射

選單項目點選時會向父視窗發送 WM_COMMAND (wParam = 項目 ID),直接在對話框訊息映射中處理:

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
    ON_COMMAND(ID_PROGLIST_IE, OnInternetExplorer)
    ON_COMMAND(ID_PLACELIST_MYDOCUMENT, OnMyDocuments)
    // ...
END_MESSAGE_MAP()

void CMyDlg::OnInternetExplorer() { /* 啟動 IE */ }
void CMyDlg::OnMyDocuments() { /* 開啟我的文件 */ }

四、關鍵介面函數速查

函數用途關鍵參數
AppendProgItem/PlaceItem新增左/右側項目szItemName, uID, uFlags(MENU_DEFAULT/POPUP/SEPARATOR/CHECK/RADIO), uIconResID, hIcon, szTooltip, pSubMenu
SetProgItemBackColor左側列表漸層背景clrLeftTop, clrRightBottom, bValid
SetItemTextColor項目文字顏色ITEM_TYPE(PROG/PLACE/BOTTOM), clrText
GetUserBitmap/GetBottomBarBitmap設定頂部/底部背景圖nMode(0/1/2...), szFilePath
SetAsSubMenu(TRUE)設為彈出子選單bSubmenu
SetItemFoucsBitmap自定義焦點高亮圖ITEM_TYPE, szBmpPath (NULL=預設藍條)

五、效果展示

XP 風格分組選單完整效果

自定義焦點高亮條與 Left Bar 風格

六、已知限制與展望

  • 極大量項目 (>500) 時首次彈出有輕微延遲,建議分頁或延遲載入。
  • 高 DPI 環境下位圖自動拉伸可能模糊,建議提供 2x 資源。
  • 未來計劃:支援觸控手勢、WPF 風格動畫過渡、JSON 格式選單定義檔。

結語

CYisongStartMenu 以純 C++ 實現,零依賴、編譯後僅需一個 DLL,提供了接近系統級開始選單的完整體驗與極高自定義自由度。適合大型 MFC 應用(如 IM 客戶端、ERP 主視窗、多媒體播放器)作為主選單或托盤選單。歡迎反饋:song_0962@sina.com / QQ: 34544052。

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