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

BCGControlBar Pro 動態換膚整合 Skin++ 庫

     編輯:關於VC++

前言

BCGControlBar Pro (現 BCGSuite) 是構建 Visual Studio/Office 風格專業 UI 的成熟 MFC 擴充庫。但其內建 Skin 範例功能有限:無法換膚標題列/捲動條/系統視窗,且缺乏豐富皮膚資源。本文示範整合商業皮膚庫 Skin++ (www.uipower.com),以最小代碼變更賦予 BCG 應用完整動態換膚能力。

整合步驟 (以 BCGCBDotNetExample 為例)

1. 包含 Skin++ 標頭 (StdAfx.h)

#include "SkinPlusPlus.h"

2. 應用程式初始化載入皮膚 (App::InitInstance)

BOOL CBCGCBDotNetExampleApp::InitInstance()
{
    // ... 原有初始化 ...
    InitializeSkin(_T("XPCorona.ssk")); // 載入 .ssk 皮膚包
    // ...
}

3. 主視窗建立時通知 BCG 重新取得系統色 (MainFrm.cpp OnCreate)

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    // ... 建立選單列、工具列 ...
    if (!m_wndMenuBar.Create(this)) return -1;

    // 關鍵:發送 WM_SYSCOLORCHANGE 讓 BCG 視覺管理器重新讀取已被 Skin++ 勾住的系統色
    m_wndMenuBar.SendMessage(WM_SYSCOLORCHANGE, 0, 0);

    // ... 建立其他工具列 ...
}

4. 解決工具列圖示透明色問題

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。

5. 程式結束釋放 Skin++ (App::ExitInstance)

int CBCGCBDotNetExampleApp::ExitInstance()
{
    ExitSkin(); // 釋放鉤子、記憶體
    return CWinApp::ExitInstance();
}

原理說明

  • Skin++ 透過全域鉤子 (SetWindowsHookEx) 攔截 GetSysColor、DrawThemeBackground 等 API,將系統色/主題繪製重導向至皮膚資源。
  • BCG 視覺管理器 (CBCGPVisualManager) 內部大量呼叫 GetSysColor 取得色彩,Skin++ 生效後自動獲得皮膚色系。
  • WM_SYSCOLORCHANGE 廣播通知所有視窗重繪,BCG 接收後重新查詢色彩並重繪工具列/選單/分頁等。
  • 工具列圖示透明色原為靜態快取,需在繪製前即時同步皮膚後的 COLOR_BTNFACE。

注意事項

  • Skin++ 為商業庫,需購買授權;亦可嘗試開源替代 (如 SkinH、DMCSkin)。
  • BCG 版本升級時 DoPaint 內部邏輯可能變更,需同步更新衍生類代碼。
  • 若應用同時使用 GDI+ 繪製,需確保 Skin++ 相容 GDI+ DC。
  • 皮膚包 .ssk 置於 EXE 同目錄或指定絕對路徑。

效果對比

整合前:標準 Office 2003 藍/銀/橄欖三色系。
整合後:任意 .ssk 皮膚 (XP/Win7/Win10/扁平化/深色模式等) 即時切換,含標題列、捲動條、選單、工具列、分頁、對話框完整換膚。

完整修改後的 MyToolBar.h 代碼隨文提供。

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