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(); 
}