隨著計算機技術的普及,軟體不再只是功能的堆砌,易用性與視覺美感已成為決定成敗的關鍵。QQ、MSN 等即時通訊軟體憑藉個性化、美觀的介面贏得大量用戶。本文將示範如何利用 Visual C++ 結合第三方換膚庫 SkinBeauty,快速實現一個擁有 QQ 風格界面的應用程式,供開發者參考借鑑。
市面上換膚元件眾多(如 SkinMagic、Skin++、USkin、AppFace、SkinCrafte 等),但各有優劣。Skin++ 資源佔用低,SkinCrafte 視覺效果更酷;而 SkinBeauty 則兼具性能與外觀,並宣稱支援鍵盤操作、在 Win2K/XP 上實現 Vista 風格的玻璃磨砂效果。更關鍵的是,其自帶的 SkinBeauty Studio 皮膚編輯器允許一套皮膚包含多種窗口樣式、按鈕樣式,完美滿足主介面、聊天視窗、多種按鈕等差異化需求——這是其他產品難以做到的。
BeautyQQ.bsk 皮膚包。SkinBeauty.dll、SkinBeauty.lib、介面標頭檔 SkinBeautyExport.h。在 VC++ 中建立名為 BeautyQQ 的 MFC 對話框專案,調整對話框大小與標題,編譯運行確認基本框架正常。

將 SkinBeauty.dll 放入專案運行目錄,.lib 與 .h 放入專案目錄。採用靜態連結方式,在 stdafx.h 中引入:
//inside stdafx.h
//SkinBeauty Lib Call
#include "SkinBeautyExport.h"
#pragma comment(lib,"SkinBeauty.lib")
在 CBeautyQQApp::InitInstance() 開頭載入皮膚:
BOOL CBeautyQQApp::InitInstance()
{
CString exeFullPath, strFilename;
int nLen = GetModuleFileName(NULL, exeFullPath.GetBuffer(MAX_PATH), MAX_PATH);
exeFullPath.ReleaseBuffer();
CString strPath = exeFullPath.Left(exeFullPath.ReverseFind('\\'));
strFilename = strPath + _T("\\beautyQQ.bsk");
SkinLoad(THCAR2char(strFilename.GetBuffer(0)));
// ... 其餘初始化代碼
}
SkinLoad() 只需傳入皮膚檔絕對路徑。官方說明:載入後無需手動調用卸載函數,引擎會在程式退出時自動清理。
運行程式,主介面已煥然一新!

新增對話框資源與類 CTalkDlg。預設情況下它會繼承主視窗皮膚,但皮膚包內已預置不同資源 ID(如 103)的視窗樣式。在 OnInitDialog 中綁定:
BOOL CTalkDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 將該對話框綁定資源 ID 103 的皮膚
BindRes2CtrlbyHWND(103, m_hWnd);
// ... 其他初始化
}
同理,按鈕等控件可用 BindRes2CtrlbyID(資源ID, 控件ID) 綁定專屬樣式。兩個核心 API 原型:
void BindRes2CtrlbyID(int nUserResID, DWORD dwCtrlID);
BOOL BindRes2CtrlbyHWND(int nUserResID, HWND hWnd);
對於選單、ListCtrl 等標準控件,換膚庫會自動接管繪製,開發者只需像平常一樣使用即可。
整個「超炫」專案僅在精靈生成框架後,呼叫兩三個第三方介面函數即告完成。SkinBeauty 提供的介面精簡(約 10 個),文檔雖為英文但易於上手。本文僅將廠商範例流程詳解,希望能拋磚引玉。
心得: 在追求效率的今天,善用可靠的第三方元件處理繁雜固化的界面邏輯,專注於核心業務創新,才能站在巨人肩膀上走得更遠。
附件提供完整原始碼供下載研究。