首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MFC 工具欄圖標背景透明化:自繪或第三方庫實現

     編輯:程式設計疑難解答

問題現象

MFC 默認工具欄 (CToolBar) 背景為系統灰色 (3D Face),圖標周圍有明顯矩形背景塊。需求:像金山衛士等安全軟件那樣,**工具欄背景透明/貼合主窗口背景,圖標無矩形塊**。

方案一:自繪 (Owner Draw) —— 原生 MFC 方案

  1. 工具欄創建時指定 TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | TBSTYLE_LIST 風格 (需 CommCtrl 4.71+)。
  2. 重寫 CToolBar::OnPaint 或處理 NM_CUSTOMDRAW 通知 (OnCustomDraw)。
  3. 在繪製代碼中:
    • 獲取工具欄客戶區矩形。
    • 用父窗口背景刷 (或主窗口背景圖) 填充工具欄背景。
    • 調用默認繪製按鈕 (DoPaint / DrawButton),按鈕背景模式設為透明。

參考實現:CSDN 經典文章 (關鍵點:SetBkMode(hdc, TRANSPARENT)、ParentWnd->OnEraseBkgnd 等)。

方案二:使用 CMFCToolBar (MFC Feature Pack / VS2008+)


// 主框架 OnCreate 中
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
    !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) {
    return -1;
}

// 關鍵:設置透明背景模式
m_wndToolBar.SetTransparentMode(TRUE); // 或 m_wndToolBar.SetBackgroundColor(COLORREF(-1));

// 設置圖標列表 (支持 32位帶 Alpha 通道圖標)
CMFCToolBarImages images;
images.Load(IDB_TOOLBAR_ICONS_32BIT); // 32位 BMP 或 PNG
m_wndToolBar.GetToolBarCtrl().SetImageList(images);

優點: 現代 MFC 封裝良好,支持 Office 2007/2010/2013 風格、高 DPI、Alpha 通道圖標、動態佈局,幾行代碼實現透明背景。

方案三:第三方 UI 庫 (Codejock Xtreme ToolkitPro / BCGControlBar)

  • 專業級 MFC 擴展庫,提供完美的 Office/Fluent/Windows 10/11 風格工具欄、Ribbon、屬性頁等。
  • 透明背景、主題切換、高 DPI、觸控優化開箱即用。
  • 商業收費,但開發效率極大提升,適合商業軟件項目。

核心技術點總結

技術點說明
TBSTYLE_TRANSPARENT工具欄控件風格標誌,告知系統背景透明 (需配合自繪)
NM_CUSTOMDRAW / OnCustomDraw自定義繪製入口,可在預繪製階段設置背景模式透明
32位圖標 (帶 Alpha)圖標本身透明,無白邊/灰底,配合透明工具欄完美融合
CMFCToolBar::SetTransparentModeFeature Pack 封裝好的一鍵透明 API

建議選型

  • VS2008+ 新項目: **直接用 CMFCToolBar + SetTransparentMode(TRUE) + 32位圖標**,最省力、最現代、維護成本最低。
  • 老項目/VC6/無 Feature Pack: 參考 CSDN 文章實現 CToolBar 自繪透明背景。
  • 商業級產品/極致 UI: 引入 Codejock/BCG,一次投資長期受益。

總結

MFC 工具欄背景透明化,**現代項目首選 CMFCToolBar 內置透明模式**,老項目靠自繪 (NM_CUSTOMDRAW + 設置背景模式透明 + 父窗口背景填充) 實現。關鍵在於**工具欄背景不自己畫色塊,而是透傳或繪製父窗口背景**,並使用**帶 Alpha 通道的 32位圖標**。

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