隨著 Windows XP 與 Office XP 釋出,扁平化、清爽的 Office XP 風格成為主流。法國開發者 Jean-Michel LE FOL 開發的 CMenuXP 類別讓 VC++ 6.0 輕鬆實現此風格。本文詳細說明整合步驟。
將 CMenuXP 原始碼資料夾 (通常命名 Tools) 複製至專案目錄。在 FileView 中:
Tools 資料夾,加入所有 .cppTool Headers,加入所有 .h#include "Tools/MenuXP.h"
#include "Tools/ToolBarXP.h"
#include "Tools/StatusBarXP.h"
#include "Tools/ComboBoxXP.h"
class CMainFrame : public CFrameWnd
{
DECLARE_MENUXP() // 加在 DECLARE_MESSAGE_MAP() 之後
// ...
};
IMPLEMENT_MENUXP(CMainFrame, CFrameWnd) // 加在 IMPLEMENT_DYNCREATE 之後
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
// ...
ON_MENUXP_MESSAGES() // 加入此行
END_MESSAGE_MAP()
BOOL CMyApp::InitInstance()
{
AfxEnableControlContainer();
CMenuXP::InitializeHook(); // 加在此處
// ...
}
int CMyApp::ExitInstance()
{
CMenuXP::UninitializeHook(); // 釋放鉤子
return CWinApp::ExitInstance();
}
在 CMainFrame::OnCreate 中:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
CMenuXP::UpdateMenuBar(this);
CMenuXP::SetXPLookNFeel(this);
// 工具列與狀態列只需將成員變數型別改為 XP 版本
// CToolBar m_wndToolBar; → CToolBarXP m_wndToolBar;
// CStatusBar m_wndStatusBar; → CStatusBarXP m_wndStatusBar;
return 0;
}
// OnCreate 中續寫
m_imgList.Create(IDB_APPLE, 16, 0, RGB(192,192,192)); // 16x16 圖示,背景色銀灰
CMenuXP::SetMenuItemImage(ID_MENUITEM_APPLE, m_imgList, 0);
需在資源編輯器加入位圖 IDB_APPLE (16×16),並在 ClassWizard 為選單項目 ID_MENUITEM_APPLE 加入處理函式。
// AppleDlg.h
#include "Tools/ComboBoxXP.h"
#include "Tools/ButtonXP.h"
class CAppleDlg : public CDialog
{
CComboBoxXP m_cmbFruit; // 下拉式方塊
CButtonXP m_btnOK; // 確定鈕
CButtonXP m_btnCancel; // 取消鈕
// ...
};
// AppleDlg.cpp - DoDataExchange
void CAppleDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_COMBO1, m_cmbFruit);
DDX_Control(pDX, IDOK, m_btnOK); // 必須為 IDOK/IDCANCEL 建立控制變數
DDX_Control(pDX, IDCANCEL, m_btnCancel);
}
// OnInitDialog
BOOL CAppleDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_cmbFruit.AddString(_T("紅蘋果"));
m_cmbFruit.AddString(_T("青蘋果"));
return TRUE;
}
編輯框、列表框、樹狀檢視等控制項尚未支援 XP 風格,期待社群持續擴充。