最近导师给了一个小项目,需要用到MFC,怎奈vc6.0的搞出来的东西实在有点丑,遂在网上搜索解决方案,最终找到了这个,SkinMagic,换肤控件。调试期间也碰到很多问题,遂一一记录下来。
SkinMagic使用方法:
1.导入文件和皮肤资源:
点击工程->增加到工程->加入SkinMagicLib.h SkinMagicLib.lib DETOURS.lib 文件;
切换到Resouce View ,右击,引入,加入皮肤资源corona.smf 注意皮肤文件ID最好改成"XXX"的形式,否则可能会出现未知错误:
2.在stdafx.h中加入头文件,如下:
#i nclude "SkinMagicLib.h"
3. 初始化SkinMagic库:
int __stdcall InitSkinMagicLib( HINSTANCE hInstance,
LPCTSTR lpApplication ,
LPCTSTR lpReserved1,
LPCTSTR lpReserved2 );
在 CxxxApp::InitInstance()中加入初始化SkinMagic库的代码:
VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL));
4.从资源文件中调用皮肤:
int __stdcall LoadSkinFromResource(HMODULE hModule,
LPCTSTR lpSkinName ,
LPCTSTR lpType);
现在CxxxApp::InitInstance()中的代码如下:
BOOL CxxxApp::InitInstance()
{
VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL));
VERIFY( 1 == LoadSkinFromResource( AfxGetInstanceHandle() , "corna","SkinMagic") );
AfxEnableControlContainer();
//…..下略
5、将皮肤应用到程序上
int __stdcall SetWindowSkin( HWND hWnd , LPCTSTR lpSkinName );
int __stdcall SetDialogSkin( LPCTSTR szSkinName );
对话框程序代码位置:
BOOL CxxxApp::InitInstance()
{
//...上略
m_pMainWnd = &dlg;
VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" ));
VERIFY( 1 == SetDialogSkin( "Dialog" ) );
int nResponse = dlg.DoModal();
//…下略
}
6、释放SkinMagic资源
void __stdcall ExitSkinMagicLib();
重载应用程序的ExitInstance()函数,添加如下代码:
int CxxxApp::ExitInstance()
{
ExitSkinMagicLib();
return CWinApp::ExitInstance();
}
Ok,到此结束,启动应用程序,你会发现你的程序焕然一新了:
编译错误总结:
error LNK2005: __setmbcp already defined in libcmtd.lib(mbctype.obj)
工程->设置->连接->输入 ,忽略库,libcmtd.lib,其他情况类似。
fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
工程->设置->c/c++->Code Generation->Multithread
最后附上下载,包括破解文件和对话框演示程序:
http://download.csdn.net/detail/emiyasstar__/3798657