文件说明
SkinMagicLib.h 必须的头文件,请添加到工程中
SkinMagic.lib + SkinMagic.dll 动态链接库配套使用
编译时需要在工程中添加SkinMagic.dll,程序运行时需要SkinMagic.dll
以下版本的编译出来的程序运行时不再依赖SkinMagic.dll
SkinMagicLibMD6.lib 静态链接库,用于VC6的Release版编译
SkinMagicLibMT6.lib 静态链接库,用于VC6的Debug版编译
使用方法 把SkinMagicLib.h放到使用的VC6工程目录下的include目录中;
把SkinMagicLibMT6.lib, SkinMagicLibMD6.lib放到使用的VC6工程目录下lib目录中;
把*.smf皮肤文件放到VC6工程的目录下skin目录中; #include "SkinMagicLib.h" Win32 Release中填上SkinMagicLibMD6.lib
Win32 Debug中填上SkinMagicLibMT6.lib ////////////////////////////////////////////////// ///////////////////////
//
// SKINMAGIC
// XPBLUESKINMAGIC DISCARDABLE"skin\\xpblue.smf"
CORONASKINMAGIC DISCARDABLE"skin\\corona.smf"
XPGREANSKINMAGIC DISCARDABLE"skin\\xpgrean.smf"
XPLUSSKINMAGIC DISCARDABLE"skin\\x-plus.smf"
DEVIORSKINMAGIC DISCARDABLE"skin\\Devior.smf"
XPSTEELSKINMAGIC DISCARDABLE"skin\\xpsteel.smf"
KROMOSKINMAGIC DISCARDABLE"skin\\Kromo.smf" 添加完毕后,会发现资源视图中会多了一个“SkinMagic”的目录 VERIFY(1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL)); CROSDlg dlg;
m_pMainWnd = &dlg;
VERIFY( 1 == LoadSkinFromResource( AfxGetInstanceHandle(), "DEVIOR" ,"SKINMAGIC") );//加载静态皮肤资源
// VERIFY( 1 == LoadSkinFile("corona.smf") );//动态加载皮肤文件
VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd, "Dialog" ));
VERIFY( 1 == SetDialogSkin( "Dialog" ) );
int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
//dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
//dismissed with Cancel
} ExitSkinMagicLib();//释放SkinMagic资源
问题处理 SkinMagicLibMT6.lib(MultiMonitor.obj) : error LNK2001: unresolved external symbol _xEnumDisplayMonitors@16
SkinMagicLibMT6.lib(MultiMonitor.obj) : error LNK2001: unresolved external symbol _xGetMonitorInfo@8
SkinMagicLibMT6.lib(MultiMonitor.obj) : error LNK2001: unresolved external symbol _xMonitorFromWindow@8
SkinMagicLibMT6.lib(MultiMonitor.obj) : error LNK2001: unresolved external symbol _xMonitorFromPoint@12
SkinMagicLibMT6.lib(MultiMonitor.obj) : error LNK2001: unresolved external symbol _xMonitorFromRect@8
Debug/ROS.exe : fatal error LNK1120: 5 unresolved externals 解决方法:将其移到使用SkinMagic时的主文件中,加其头文件如下
#include "SkinMagicLib.h"
#pragma warning(disable:4706)
#define COMPILE_MULTIMON_STUBS
#include
#pragma warning(default:4706) "LIBCMT.lib"和其他的一些libs有冲突,这个有可能是本人程序遇见的问题,未证实
LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMT.lib(atox.obj) : error LNK2005: _atoi already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in msvcrtd.lib(cinitexe.obj)
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in msvcrtd.lib(cinitexe.obj)
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrtd.lib(cinitexe.obj)
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in msvcrtd.lib(cinitexe.obj)
LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in msvcrtd.lib(MSVCRTD.dll)
LIBCMT.lib(strtol.obj) : error LNK2005: _strtoul already defined in msvcrtd.lib(MSVCRTD.dll)
msvcrtd.lib(MSVCRTD.dll) : error LNK2005: __setmbcp already defined in LIBCMT.lib(mbctype.obj)
LINK : warning LNK4098: defaultlib "msvcrtd.lib" conflicts with use of other libs; use /NODEFAULTLIB:library
LINK : warning LNK4098: defaultlib "LIBCMT" conflicts with use of other libs; use /NODEFAULTLIB:library
LIBCMT.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/ROS.exe : fatal error LNK1120: 1 unresolved externals 解决方法:问题的原因上面已经指出,就是红色那一句,默认的"msvcrtd.lib"和其他的一些libs有冲突,可以用/NODEFAULTLIB:library 设置屏蔽掉默认的libcmt.lib
在Project中打开Project Setting设置对话框,选择Link选中Category旁边下拉框的Input项
在Ignore Libraries下面输入libcmt.lib,将此屏蔽 SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _InitMultipleMonitorStubs already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _xGetSystemMetrics@4 already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _xMonitorFromPoint@12 already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _xMonitorFromRect@8 already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _xMonitorFromWindow@8 already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _xGetMonitorInfo@8 already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _xEnumDisplayMonitors@16 already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _g_fMultiMonInitDone already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _g_pfnEnumDisplayMonitors already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _g_pfnGetMonitorInfo already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _g_pfnMonitorFromPoint already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _g_pfnMonitorFromRect already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _g_pfnMonitorFromWindow already defined in ROS.obj
SkinMagicLibMD6.lib(MultiMonitor.obj) : error LNK2005: _g_pfnGetSystemMetrics already defined in ROS.obj
Release/ROS.exe : fatal error LNK1169: one or more multiply defined symbols found 解决方法:在 Project/Setting/Link/General中的 Project Options: 加入 /FORCE:MULTIPLE 即可
也可以代码实现,在stdafx.h中添加代码
#pragma comment(linker, "/FORCE:MULTIPLE")
#pragma comment(linker, "/OPT:NOREF") 解决方法:
当然要有其菜单项信息,这里程序使用的资源ID是 IDR_MENU
首先屏蔽掉App中InitInstance()函数中的
// VERIFY( 1 == SetDialogSkin( "Dialog" ) );
在主窗体中的头文件.h中定义一个菜单
CMenu m_menu;
在主窗体中的执行文件.cpp中的OnCreate()函数中建立菜单
m_menu.LoadMenu(IDR_MENU);
SetMenu( &m_menu );
在主窗体中的执行文件.cpp中的OnInitDialog()初始化对话框函数中设置SkinMagic外肤
VERIFY( 1 == SetWindowSkin( m_hWnd , "Dialog" ));
EnableWindowScrollbarSkin( m_hWnd , SB_BOTH ); 一些自定义控件的处理,在使用对话框程序时,有一些自定义的控件,比如说加载的自定义按钮、静态文本框等等,在使用SkinMagic时后,他们将无法正常使用
解决方法:解决很简单,在SkinMagic中移除它即可
// CStaticTrans m_staticCarSpeed;
// m_staticCarSpeed 是自定义一个显示车速的静态文本控件
VERIFY( 1 == RemoveWindowSkin( m_staticCarSpeed.m_hWnd ) ); 解决方法:由于极少在文档中使用SkinMagic,只简单列出示例
BOOL CxxxApp::InitInstance()
{
//...
VERIFY( 1 == InitSkinMagicLib( AfxGetInstanceHandle(), NULL, NULL, NULL ) );
VERIFY( 1 == LoadSkinFile( _T("corona.smf") ) );
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , _T("MainFrame") ));
SetControlTooltip( pMainFrame->m_wndToolBar.m_hWnd , _T("ToolBar") );
VERIFY( 1 == SetDialogSkin( _T("Dialog") ) );
//...
}
在子窗口重载WM_CREATE在其中添加代码
SetWindowSkin( m_hWnd , _T("MainFrame") );f皮肤文件放到VC6工程的目录下skin目录中;