動態換膚能讓使用者依喜好切換介面風格,提升軟體吸引力。傳統作法多在對話方塊貼圖片,技術門檻低但彈性有限。本文介紹以 CReBar(復合條)搭配透明工具列 實現類似 IE 瀏覽器的專業級換膚技術。
TBSTYLE_TRANSPARENT),使背景圖片透出。m_wndDlgBar)。TBSTYLE_FLAT | TBSTYLE_TRANSPARENT 風格。m_wndReBar.AddBar() 將透明工具列加入 ReBar。m_bmpBack = (HBITMAP)::LoadImage(
AfxGetInstanceHandle(),
_T("back.bmp"),
IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE | LR_CREATEDIBSECTION
);
CReBarCtrl& rc = m_wndReBar.GetReBarCtrl();
REBARBANDINFO info = {0};
info.cbSize = sizeof(info);
info.fMask = RBBIM_BACKGROUND; // 指定 hbmBack 有效
info.hbmBack = (m_bmpBack != INVALID_HANDLE_VALUE) ? m_bmpBack : NULL;
rc.SetBandInfo(0, &info);
rc.UpdateWindow();
// 使用者選擇新皮膚檔案後
::CopyFile(newSkinPath, _T("back.bmp"), FALSE); // FALSE = 覆蓋現有檔案
// 重複上述載入與 SetBandInfo 步驟即可即時生效
| 技術點 | 說明 |
|---|---|
| TBSTYLE_TRANSPARENT | 工具列背景透明,讓 ReBar 底圖顯示 |
| RBBIM_BACKGROUND | REBARBANDINFO 遮罩,啟用背景位圖 |
| LR_CREATEDIBSECTION | 建立 DIB 區塊,方便後續像素操作 |
| CopyFile(..., FALSE) | 覆蓋模式,確保新皮膚立即生效 |
透過 CReBar 容器特性與工具列透明化,即可在 VC++ 中實現專業級動態換膚。此架構擴充性佳,可進一步支援多重工具列、狀態列換膚等進階需求。