www.pudn.com > SDKSkin.rar > SDKSkin.cpp
/****************************************************
** Fujitsu Copyright (C) 2006 - 2007
** 功 能: 皮肤类接口,完成皮肤的安装和卸载
** 文件名称: SDKSkin.cpp
** 文件基类:
** 扩 展 名: cpp
** 创建日期: 2006-8-6 15:59
** 作 者: 汪荣
*****************************************************/
#include "stdafx.h"
FILE *pFile = NULL;
/********************************************
* 功 能:输出函数,完成皮肤的安装,注意这里是对主线程
* 进行安装,否则皮肤将不完整
* 参 数:hInstance_-被换肤的应用程序的实例;
* 返回值:成功返回0;否则非0
*********************************************/
extern "C" __declspec(dllexport) int InstallSkin(HINSTANCE hInstance_);
extern "C" __declspec(dllexport) int SetSkin(LPTSTR skinFilename);
/********************************************
* 功 能:输出函数,完成皮肤的卸载,并清出相应的资源
* 参 数:无
* 返回值:成功返回0;否则非0
*********************************************/
extern "C" __declspec(dllexport) void UninstallSkin();
// ******************* 全局变量的定义
HHOOK skinOldHook; // 原来的钩子,卸载用
HINSTANCE hInstance = 0;
// ******************* 全局函数原型的定义
// 自定义的钩子处理函数
LRESULT CALLBACK SkinHookProc(int nCode, WPARAM wParam, LPARAM lParam);
// 被钩住的窗口的消息处理函数
LRESULT CALLBACK SkinItemsProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
// ******************** 引入函数的定义
extern void PaintSkin(HWND hWnd);
extern bool PaintDlgBG(HWND hWnd,HINSTANCE hInstance);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
extern "C" __declspec(dllexport) int InstallSkin(HINSTANCE hInstance_)
{
SkinIni::Instance()->InitSkinIni("");
errSCode retVal = SK_SUCC;
if(0 == hInstance_) return SKIN_HWND_NULL;
/*if((retVal=SkinIni::Instance()->InitSkinIni(_T("E:\\SDKSkin\\skin1\\skin.ini"))) != SK_SUCC)
{
return retVal;
}*/
UninstallSkin();
hInstance = hInstance_;
//pFile = fopen("d:\\Skin.txt","wb");
// SkinMenuBar::Init();
skinOldHook = (HHOOK)::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)SkinHookProc,hInstance_,GetCurrentThreadId());
return retVal;
}
extern "C" __declspec(dllexport) int SetSkin(LPTSTR skinFilename)
{
SkinIni::Instance()->InitSkinIni(skinFilename);
SkinResList::UpdateHwnds();
return 0;
}
extern "C" __declspec(dllexport) void UninstallSkin()
{
hInstance = 0;
if(0 != skinOldHook)
{
UnhookWindowsHookEx(skinOldHook);
skinOldHook = 0;
}
SkinResList::UnsubAllClass();
SkinResList::UpdateHwnds();
//UpdateWindow(NULL);
}
LRESULT CALLBACK SkinHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
PCWPSTRUCT pcs = (PCWPSTRUCT)lParam;
HWND hWnd = pcs->hwnd;
int nDefault = PROC_DEFAULT;
if(HC_ACTION == nCode && 0 != hWnd)
{
if(pcs->message == WM_CREATE)
{
// 子类化窗口并加入映射表
// 相应的消息处理由SkinItemsProc来完成
SkinResList::Subclass(hWnd,(WNDPROC)SkinItemsProc);
}
}
// 继续下一个钩子
return CallNextHookEx(skinOldHook,nCode,wParam,lParam);
}
LRESULT CALLBACK SkinItemsProc(HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
int nDefault = PROC_FILTER;
WNDPROC oldProc_ = SkinResList::FindWndProc(hwnd);
//return CallWindowProc(oldProc_,hwnd,uMsg,wParam,lParam);
SKINMSG skMsg;
skMsg.InitMsg(hwnd,uMsg,wParam,lParam);
//return SkinResList::CallDefWndProc(skMsg);
SkinProcessor skProcess(skMsg);
return skProcess.ProcessSkin();
}