Windows XP 風格的「開始選單」(分組式/經典式)與 Vista 風格選單,以其豐富的視覺層次、鍵盤/滑鼠雙模操作、極高的自定義彈性,成為專業軟體主選單的標桿。本文介紹一款封裝完善的 MFC 選單類別庫 CYisongStartMenu,功能涵蓋 XP 兩種模式、托盤選單、右鍵快捷選單,支援自定義背景圖、焦點高亮條、Left Bar、Check/Radio 項目、熱鍵與方向鍵導航。
| 分類 | 功能 |
|---|---|
| 項目管理 | AppendProgItem:左側程式清單項目(支援子選單彈出) |
AppendPlaceItem:右側常用位置/分組項目 | |
AppendBottomItem:底部功能列(關機、登出等) | |
| 視覺自定 | 頂部使用者欄:文字、圖示、背景圖 (多張輪播) |
| 項目文字顏色、焦點高亮圖 (支援自定義位圖、任意尺寸) | |
| Left Bar 風格、底部背景圖 | |
| 互動增強 | 滑鼠點選、懸停、方向鍵上下左右、熱鍵 (Alt+字母) |
| Check/Radio 樣式、分隔線、動態增刪項目 |
YisongStartMenu.dll / .lib MyStartMenuLib.h, MyStartMenu.h, CmyToolTipCtrl.h
#include "MyStartMenuLib.h"
class CMyDlg : public CDialog {
CYisongStartMenu m_StartMenu;
// ...
};
// 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 (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=預設藍條) |


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