隨著 Windows XP 與 Office XP 的發布,那種兼具華麗與清爽的 Office XP 介面風格迅速取代了傳統的 Windows 經典風格,成為當時應用程式開發的主流「潮流」。對於 Visual C++ 開發者而言,如何讓自家應用程式也擁有這樣現代化的外觀,成為了一個熱門話題。法國開發者 Jean-Michel LE FOL 針對 Visual C++ 開發了 CMenuXP 類別,讓開發者能輕鬆為應用程式換上 Office XP 風格的介面。本文將詳細記錄使用 CMenuXP 的完整步驟,助你快速上手。
首先,建立一個名為 SDIXP 的單一檔案 MFC 應用程式專案。在正式使用 CMenuXP 之前,必須完成以下準備工作:
將 CMenuXP 的原始碼(.cpp)與標頭檔(.h)所在的資料夾(通常命名為 Tools)複製到 SDIXP 專案的原始碼目錄下。
切換到 Visual C++ 的「檔案檢視」,在 Source Files 下建立新資料夾 Tools,並將所有 *.cpp 加入;同理,在 Header Files 下建立 Tool Headers,將所有 *.h 加入。
在 MainFrm.h 中加入必要的標頭檔與巨集:
#include "Tools/MenuXP.h"
#include "Tools/ToolBarXP.h"
#include "Tools/StatusBarXP.h"
#include "Tools/ComboBoxXP.h"
class CMainFrame : public CFrameWnd
{
// ... 原有程式碼 ...
DECLARE_MESSAGE_MAP()
DECLARE_MENUXP() // 加在 DECLARE_MESSAGE_MAP() 之後
};
在 MainFrm.cpp 中實作巨集並加入訊息映射:
IMPLEMENT_MENUXP(CMainFrame, CFrameWnd) // 加在 IMPLEMENT_DYNCREATE 之後
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
// ... 原有映射 ...
ON_MENUXP_MESSAGES() // 加入此行
END_MESSAGE_MAP()
在 CSDIXPApp::InitInstance() 中加入初始化:
AfxEnableControlContainer();
CMenuXP::InitializeHook(); // 加在 AfxEnableControlContainer() 之後
並為 CSDIXPApp 重寫 ExitInstance():
int CSDIXPApp::ExitInstance()
{
CMenuXP::UninitializeHook();
return CWinApp::ExitInstance();
}
按 F7 編譯,若無錯誤即可開始美化介面。
在 CMainFrame::OnCreate() 中加入兩行程式碼即可:
CMenuXP::UpdateMenuBar(this);
CMenuXP::SetXPLookNFeel(this);
編譯執行,選單列立刻煥然一新。
使用 CMenuXP::SetMenuItemImage(UINT nID, HIMAGELIST hImgList, int nIndex)。範例:新增「水果」選單與「蘋果」項目(ID 為 ID_MENUITEM_APPLE),匯入位圖資源 APPLE.bmp(ID 為 IDB_APPLE)。
在 CMainFrame 加入 CImageList m_imgList 成員,並在 OnCreate() 中初始化:
m_imgList.Create(IDB_APPLE, 0, 0, RGB(192,192,192)); // 建議 16x16 像素
CMenuXP::SetMenuItemImage(ID_MENUITEM_APPLE, m_imgList, 0);
執行後,「水果 | 蘋果」選單項前將顯示蘋果圖示。
只需將 MainFrm.h 中的成員變數型別修改:
// 原本
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
// 修改為
CStatusBarXP m_wndStatusBar;
CToolBarXP m_wndToolBar;
重新編譯執行,工具列與狀態列即刻擁有 Office XP 風格。
建立對話框資源 IDD_APPLE,加入下拉式方塊 IDC_COMBO1,透過 ClassWizard 建立 CAppleDlg 類別並關聯控制變數 m_cmbx1。在 OnInitDialog() 初始化項目:
BOOL CAppleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_cmbx1.AddString(_T("紅蘋果"));
m_cmbx1.AddString(_T("青蘋果"));
return TRUE;
}
在 AppleDlg.h 加入標頭檔並修改變數型別:
#include "Tools/ComboBoxXP.h"
// ...
CComboBoxXP m_cmbx1; // 原為 CComboBox
因預設按鈕使用 IDOK/IDCANCEL,需手動加入控制變數並進行 DDX 關聯:
// AppleDlg.h
CButtonXP m_btnOK;
CButtonXP m_btnCancel;
// AppleDlg.cpp - DoDataExchange
DDX_Control(pDX, IDOK, m_btnOK);
DDX_Control(pDX, IDCANCEL, m_btnCancel);
並在 AppleDlg.h 加入 #include "Tools/ButtonXP.h"。
使用 Jean-Michel LE FOL 的 CMenuXP 類庫,能以相當簡便的方式為 VC++ 應用程式套用 Office XP 風格介面,涵蓋選單、工具列、狀態列、下拉式方塊與按鈕等常用控件。唯一的遺憾是部分控件(如編輯框)尚未支援 XP 風格,期待原作者或社群持續完善。若你正在維護舊版 VC++ 專案並想快速現代化介面,CMenuXP 是極佳的選擇。