BCGControlBar Pro (現 BCGSuite) 是構建 Visual Studio/Office 風格專業 UI 的成熟 MFC 擴充庫。但其內建 Skin 範例功能有限:無法換膚標題列/捲動條/系統視窗,且缺乏豐富皮膚資源。本文示範整合商業皮膚庫 Skin++ (www.uipower.com),以最小代碼變更賦予 BCG 應用完整動態換膚能力。
#include "SkinPlusPlus.h"
BOOL CBCGCBDotNetExampleApp::InitInstance()
{
// ... 原有初始化 ...
InitializeSkin(_T("XPCorona.ssk")); // 載入 .ssk 皮膚包
// ...
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// ... 建立選單列、工具列 ...
if (!m_wndMenuBar.Create(this)) return -1;
// 關鍵:發送 WM_SYSCOLORCHANGE 讓 BCG 視覺管理器重新讀取已被 Skin++ 勾住的系統色
m_wndMenuBar.SendMessage(WM_SYSCOLORCHANGE, 0, 0);
// ... 建立其他工具列 ...
}
Skin++ 改變系統色後,BCG 工具列圖示的透明色 (預設 COLOR_BTNFACE) 會變錯,導致圖示背景呈現舊系統色。解法:衍生 CBCGPToolBar 覆寫 DoPaint,繪製前動態設定正確透明色。
class CMyBCGPToolBar : public CBCGPToolBar
{
virtual void DoPaint(CDC* pDCPaint)
{
// ... 完整複製基類 DoPaint 邏輯 (約 200 行) ...
// 關鍵修改處:
pHotImages->SetTransparentColor(GetDefaultSysColor(COLOR_BTNFACE)); // 改為即時取得系統色
// 其餘 pColdImages/pDisabledImages/pMenuImages 同理
// ...
}
};
專案中所有 CBCGPToolBar 變數改為 CMyBCGPToolBar。
int CBCGCBDotNetExampleApp::ExitInstance()
{
ExitSkin(); // 釋放鉤子、記憶體
return CWinApp::ExitInstance();
}
SetWindowsHookEx) 攔截 GetSysColor、DrawThemeBackground 等 API,將系統色/主題繪製重導向至皮膚資源。CBCGPVisualManager) 內部大量呼叫 GetSysColor 取得色彩,Skin++ 生效後自動獲得皮膚色系。WM_SYSCOLORCHANGE 廣播通知所有視窗重繪,BCG 接收後重新查詢色彩並重繪工具列/選單/分頁等。COLOR_BTNFACE。SkinH、DMCSkin)。DoPaint 內部邏輯可能變更,需同步更新衍生類代碼。.ssk 置於 EXE 同目錄或指定絕對路徑。整合前:標準 Office 2003 藍/銀/橄欖三色系。
整合後:任意 .ssk 皮膚 (XP/Win7/Win10/扁平化/深色模式等) 即時切換,含標題列、捲動條、選單、工具列、分頁、對話框完整換膚。
完整修改後的 MyToolBar.h 代碼隨文提供。