文件說明
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目錄中;