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

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