SkinMagic库下载地址:
转:
SkinMagic的使用方法-——为VC开发程序换皮肤
自从学习了VC以后,开始对MFC编程有了很大的兴趣,于是就到处找用VC写的应用程序,学上几招,自己也写个小应用程序来玩玩。于是第一个下手的便是“Autorun.inf 免疫器”,其中的代码倒不是问题,只是总觉的VC6.0的控件和皮肤有点让人看不下去……什么?自己贴图?我可没这本事啊……然而某日偶发现了这个——SkinMagic,正好实现了我的要求。
先到百度上搜索SkinMagicToolkit并下载回来,里边包含以下的文件:SkinMagicLib.h 头文件;SkinMagic.lib + SkinMagic.dll 动态连接库文件;SkinMagicLibMD6.lib 发布版的静态连接库;SkinMagicLibMT6.lib 调试版的静态链接库。由于向我这样的新手写的应用程序也就一个可执行文件,所以在这里就先说一下静态链接的方法并且把皮肤文件加载到资源中。
1.首先要把SkinMagicLib.h和SkinMagicLibMT6.lib放在工程目录下。
2.在C***App所在的cpp文件中加入#include "SkinMagicLib.h"。(已好)
3.在菜单Project|Settings的Link选项卡下的Object/library modules中加入SkinMagicLibMD6.lib,将发布版的静态库加到工程中。
(我是VS2010将lib库在 项目->属性-->链接器--->输入---->附加依赖项中加入)
4.将皮肤加载到资源中:资源视图中项目名上右键Import,选择皮肤文件(在skin文件里),弹出对话框中的Resource type中填入SKINMAGIC。修改资源ID为IDR_SKIN_XPGREAN(以xpgrean.smf为例)。
5.在C***App的InitInstance()函数的开始部分加入如下代码:
VERIFY( 1 == InitSkinMagicLib( AfxGetInstanceHandle(), _T("ReadUI") ,NULL,NULL ) );//初始化
VERIFY(1 == LoadSkinFromResource(NULL, (LPSTR)IDR_SKIN_XPGREAN, "SKINMAGIC"));//载入皮肤资源
VERIFY(1 == SetDialogSkin("Dialog"));//设置对话框皮肤
如果是文档程序就加入下面一句代码:
VERIFY(1 == SetWindowSkin(m_pMainWnd->m_hWnd, "MainFrame"));//设置窗口皮肤
以上的函数在SkinMagicLib.h头文件中有详细的定义和解释。
关于VERIFY干什么用的请自己查阅MSDN。
6.打开ClassWizard在C***App中添加ExitInstance()函数加入如下代码释放SkinMagic资源:
ExitSkinMagicLib();
7.编译运行,窗口皮肤好看多了,呵呵。
你也可以尝试一下其它的皮肤,当然如果你认为自带的皮肤不够好,你也可以找找SkinMagicSDK,通过SkinBuilder来编辑自己的皮肤。
如果使用动态库的话,只需把SkinMagic.lib和SkinMagic.dll 动态连接库文件放到工程的文件夹下,将SkinMagic.lib 导入到工程中即可,只是发布是要带着SkinMagic.dll文件一起发布。
我按上面的方法做时出问题:
-
1>LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
-
1>SkinMagicLibMD6.lib(SkinMenuBar.obj) : warning LNK4049: 已导入本地定义的符号 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z (public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *,unsigned int))
-
1>SkinMagicLibMD6.lib(SkinMDIClientWnd.obj) : warning LNK4217: 本地定义的符号 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z (public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *,unsigned int)) 在函数 "public: virtual void __thiscall CSkinObject::SetTooltip(char const *)" (?SetTooltip@CSkinObject@@UAEXPBD@Z) 中导入
-
1>SkinMagicLibMD6.lib(SkinMenuItem.obj) : warning LNK4217: 本地定义的符号 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z (public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *,unsigned int)) 在函数 "public: __thiscall CSkinMenuItem::CSkinMenuItem(struct tagRECT,class CSkinWnd *,class CMenuBarSkinData *)" (??0CSkinMenuItem@@QAE@UtagRECT@@PAVCSkinWnd@@PAVCMenuBarSkinData@@@Z) 中导入
-
1>SkinMagicLibMD6.lib(FrameWndSkinData.obj) : warning LNK4049: 已导入本地定义的符号 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z (public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *,unsigned int))
-
1>SkinMagicLibMD6.lib(ControlSkinData.obj) : warning LNK4217: 本地定义的符号 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z (public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *,unsigned int)) 在函数 "public: __thiscall CControlSkinData::CControlSkinData(int)" (??0CControlSkinData@@QAE@H@Z) 中导入
-
1>SkinMagicLibMD6.lib(SkinControl.obj) : warning LNK4049: 已导入本地定义的符号 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z (public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *,unsigned int))
-
1>SkinMagicLibMD6.lib(SkinButtonBase.obj) : warning LNK4049: 已导入本地定义的符号 ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z (public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *,unsigned int))
-
....................................
是因为我工程设置的是使用共享的dll(菜单 项目-->属性-->配置属性-->右边的MFC的使用).
所以应该使用动态库版本,而不是静态库版本.
以下是动态库版本的(基于对话框):
1 把SkinMagic.lib + SkinMagic.dll 动态连接库文件 放在exe程序所在的目录.
2.在C***App所在的cpp文件中加入#include "SkinMagicLib.h"。(已好)
3 把SkinMagic.lib 加入到工程中. 方法可参考: http://blog.chinaunix.net/uid-25958655-id-4194449.html
4.将皮肤加载到资源中:资源视图中项目名上右键Import,选择皮肤文件(在skin文件里),弹出对话框中的Resource type中填入SKINMAGIC。修改资源ID为IDR_SKIN_XPGREAN(以xpgrean.smf为例)。
5.在C***App的InitInstance()函数的开始部分加入如下代码:
VERIFY( 1 == InitSkinMagicLib( AfxGetInstanceHandle(), _T("ReadUI") ,NULL,NULL ) );//初始化
VERIFY(1 == LoadSkinFromResource(NULL, (LPSTR)IDR_SKIN_XPGREAN, "SKINMAGIC"));//载入皮肤资源
VERIFY(1 == SetDialogSkin("Dialog"));//设置对话框皮肤
如果是文档程序就加入下面一句代码:
VERIFY(1 == SetWindowSkin(m_pMainWnd->m_hWnd, "MainFrame"));//设置窗口皮肤
以上的函数在SkinMagicLib.h头文件中有详细的定义和解释。关于VERIFY干什么用的请自己查阅MSDN。
6.打开ClassWizard在C***App中添加ExitInstance()函数加入如下代码释放SkinMagic资源:
ExitSkinMagicLib();
7.编译运行,窗口皮肤好看多了,呵呵。
你也可以尝试一下其它的皮肤,当然如果你认为自带的皮肤不够好,你也可以找找SkinMagicSDK,通过SkinBuilder来编辑自己的皮肤。
运行 就可以看到看见漂亮的界面了.
转:
1.把:SkinMagicLib.h,DETOURS.lib,SkinMagicLib.lib三个文件拷入工程目录
注意:如果你的工程是使用的共享DLL,那么你要选择共享DLL的SkinMagicLib.h,SkinMagicLib.lib
如果你的程序是使用的静态连接DLL的,那你选择静态的SkinMagicLib.h,SkinMagicLib.lib
否则连接时出问题...
阅读(1558) | 评论(0) | 转发(0) |