VC添加皮肤――SkinMagic msvcrtd.dll_本地测试

文件说明

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目录中;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章