源代碼中包括兩個壓縮包:
SkinLoad.zip為本文示例工程
skinloadv0.3.rar為版本更新SkinLoad v0.3
說明:SkinLoad是一個給程序換膚的工具,通過幾個簡單的函數調用就可以給你的應用程序加上漂亮的皮膚,包括所有的系統對話框。通過SkinLoadMaker皮膚編輯工具,可以自己定制皮膚。
界面效果圖如下:
如何在程序中實現換膚:
一、靜態鏈接動態庫
需要三個文件:"SkinLoadLib.h","SkinLoad.lib","SkinLoad.dll"
1、添加 "SkinLoadLib.h"、"SkinLoad.lib"文件到工程中
2、在App類中包含頭文件:
#include "SkinLoadLib.h"
3、在App類的 InitInstance()函數中初始化動態庫,加載皮膚文件:
InitSkinLoad(GetCurrentThreadId());
LoadSkin("xp_normal.skin"); //可以放在任何地方,如果在不同的文件中,要包含路徑
4、在App類的 ExitInstance() 中卸載動態庫,釋放使用的資源:
ExitSkinLoad();
說明:這樣使用方便,缺點是程序運行時必須保證 SkinLoad.dll 文件存在,否則程序無法運行
二、動態加載動態庫
1、在App類的 InitInstance()函數中加載動態庫。
定義一個變量保存加載的動態庫句柄,可以是全局的,也可以是App類的成員變量
HINSTANCE m_hDllSkin;
m_hDllSkin = LoadLibrary("SkinLoad.dll");
2、在App類的 InitInstance()函數中調用初始化函數和加載皮膚文件的函數
if(m_hDllSkin != NULL)
{
typedef int (* INITSKIN)(DWORD dwThreadId);
typedef bool (* LOADSKIN)(char* cPath);
INITSKIN pInitSkin = (INITSKIN)GetProcAddress(m_hDllSkin,"InitSkinLoad");
LOADSKIN pLoadSkin = (LOADSKIN)GetProcAddress(m_hDllSkin,"LoadSkin");
if(pInitSkin != NULL && pLoadSkin != NULL)
{
(*pInitSkin)(GetCurrentThreadId());
(*pLoadSkin)("xp_normal.skin");
}
}
3、在App類的 ExitInstance() 中卸載動態庫
if(m_hDllSkin != NULL)
{
typedef bool (* EXITSKIN)();
EXITSKIN pExitSkin = (EXITSKIN)GetProcAddress(m_hDllSkin,"ExitSkin");
if(pExitSkin != NULL)
{
(*pExitSkin)();
}
FreeLibrary(m_hDllSkin);
}
說明:這樣使用比較麻煩,要手動加載動態庫,還要自己獲取函數指針再用。但是這樣可以在程序中判斷所需的 SkinLoad.dll 動態庫是否存在,不至於造成程序無法運行
皮膚制作工具 SkinLoadMaker 使用說明:
程序自帶一個皮膚文件,制作自己的皮膚文件時只要修改相應的地方就可以了。如果不做任何修改也可以直接生成一個皮膚文件,和我的 xp_normal.skin 是一樣的。運行 SkinLoadMaker 時,會產生一個Temp文件夾,裡面放的是程序使用的圖片,大家照著格式改就可以了。
說明:
標題欄背景圖:要求有兩個,一個是正常狀態的,一個是程序失去焦點的,按上下順序放在一張圖中
標題欄按鈕:包括最小化、最大化、恢復、關閉。每種一幅圖,包含四張小圖,分別是Normal、Mouse On、Mouse Down、Disabled
按鈕位圖:可以不使用。也是四個狀態放到一張圖中。分別是Normal、Mouse On、Mouse Down、Disabled