首页 > 代码库 > [MFC美化] MFC使用SkinMagic详解-1
[MFC美化] MFC使用SkinMagic详解-1
【SkinMagic使用流程】
1.工程配置SkinMagic相关文件
2.初始化SkinMagic皮肤文件,窗体加载皮肤
3.释放皮肤资源
1.工程配置SkinMagic相关文件
在给窗体或对话框加载皮肤的时候首先要把使用SkinMagic所用到的相关Dll、.h文件、Lib包含到工程目录下:
SkinMagicLib.h :放到工程的根目录
SkinMagic.lib :放到工程的根目录或者放到其他目录,后者需要工程添加现有项,添加进资源文件
SkinMagic.dll :放到debug调试目录
最后把相关的.smf皮肤文件放置到根目录,例如根目录的SkinMagic文件夹下。路径:SkinMagic/corona.smf。
以下版本的编译出来的程序运行时不再依赖SkinMagic.dll
SkinMagicLibMD6.lib 静态链接库,用于VC6的Release版编译
SkinMagicLibMT6.lib 静态链接库,用于VC6的Debug版编译
2.初始化SkinMagic皮肤文件,窗体加载皮肤
步骤如下:
1.在工程的stdafx.h里加载SkinMagicLib.h和SkinMagic.lib,尽量放在最后include,防止报错
#include "SkinMagicLib.h" #pragma comment(lib,"SkinMagic")//也可以在依赖项里面设置
或者:
1、将SkinMagic.dll放置在调试目录
2、设置库文件目录,在项目[链接器]的[附加依赖项]中加入库SkinMagic.lib
3、在项目的stdafx.h文件中加入头文件 #include "SkinMagicLib.h"
2.初始化SkinMagic库
要使用SkinMagic,这一步必不可少。在App(应用程序)类的InitInstance()函数创建主窗口之前,添加初始化SkinMagic资源的代码。
InitCommonControlsEx(&InitCtrls);
//初始化皮肤库,关键在第一个要获取实例句柄。其他可为NULL。 VERIFY(1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL));
对话框:
InitCommonControlsEx(&InitCtrls);在这之后添加
单文档:
在ClassView中找到CxxxAPP类.然后找到InitInstance()函数,然后在
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();在这之前添加
说明:
int InitSkinMagicLib( //初始化SkinMagic工具库
HINSTANCE hInstance, //应用程序句柄
char* szApplication , //皮肤文件中定义的应用程序名,置为NULL即可
char* szRegCode, //SkinMagic的使用注册码。若无置为NULL
char* szReserved2 //保留位,为NULL
);
3.加载皮肤文件。
可以在App(应用程序)类的InitInstance()函数中也可以在Dialog的OnInitDialog()中加载。
加载分两种:(1)添加皮肤文件到资源中,并编译到程序中。
(2)程序在运行时动态加载皮肤文件。
静态加载:比如添加corona.smf,设置资源类型为"SKINMAGIC", 资源ID为IDR_SKIN_CORONA
VERIFY(1 == LoadSkinFromResource(NULL, (LPSTR)IDR_SKIN_CORONA, "SKINMAGIC"));
动态加载:比如根目录下SkinMagic文件夹。路径:SkinMagic/corona.smf。
VERIFY(1 == LoadSkinFile("SkinMagic/corona.smf"));
说明:
//资源名称带有双引号
int LoadSkinFromResource(
HMODULE hModule, //包含皮肤文件的模块句柄,若NULL表面在本模块中
char* lpSkinName , //皮肤资源的名称
char* lpType); //资源的类型
4.为窗口添加皮肤:
1)为标准窗口(拥有标题栏、系统菜单、可变大小等特征,比如文档/视图结构和有菜单的对话框)添加皮肤,通常用于主窗口.
在应用程序类的InitInstance()函数的底部加入如下代码
VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" )); m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow();
说明:
int SetWindowSkin(
HWND hWnd, //要使用皮肤的窗口句柄
char* lpSkinName //为skinFrameWnd对象指定的名称
);
2)为对话框添加皮肤
在对话框显示之前调用,通常在应用程序初始化函数中调用.
CNetworkDlg dlg; m_pMainWnd = &dlg; VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" )); VERIFY( 1 == SetDialogSkin( "Dialog" ) ); INT_PTR nResponse = dlg.DoModal();
说明:
int SetDialogSkin(
char* lpSkinName //为skinFrameWnd对象指定的名称
);
使用该函数后,以后程序创建的对话框都将使用该皮肤,但对话框大小不可变。
3)为单个对话框窗口添加皮肤
例如在对话框视图中:重载对话框视图的创建函数OnCreate,加入如下代码:
VERIFY( 1 == SetSingleDialogSkin( m_hWnd, "Dialog" ) ); EnableWindowScrollbarSkin( m_hWnd , SB_BOTH );
说明:
int SetSingleDialogSkin(
HWND hWnd, //要使用皮肤的窗口句柄
char* lpSkinName //为skinFrameWnd对象指定的名称
);
int EnableWindowScrollbarSkin( //为滚动条添加皮肤
HWND hWnd, //要使用皮肤的窗口句柄
int* fnBar //要使用皮肤的滚动条,SB_BOTH表明是横竖都是用皮肤
);
3.释放皮肤资源
在App(应用程序)类中重载应用程序的ExitInstance()函数,
可仿照InitInstance()手动添加,也可在CxxxAPP类中,右键选AddVirtualFunction,然后添加ExitInstance()函数,在其中加入:
//释放SkinMagic资源 ExitSkinMagicLib();
参考链接:
http://blog.csdn.net/colinchan/article/details/1572182
http://www.cnblogs.com/tianlangshu/archive/2011/03/20/1989436.html
http://blog.csdn.net/nonecode/article/details/7951975
注意事项:
1. 对话框美化时,Skinmagic无法显示菜单
用到Skinmagic皮肤库的时候,在App类的InitInstance函数中加载皮肤库成功后,却发现自己的菜单无法正常显示了!
解决办法:加载皮肤文件类型在InitInstance函数中实现,加载皮肤名字的时候在Dlg类中加载。
在App类的InitInstance()函数中只需要输入:
VERIFY( 1 == InitSkinMagicLib( AfxGetInstanceHandle(), NULL , NULL, NULL ) ); VERIFY( 1 == LoadSkinFromResource( AfxGetInstanceHandle() , _T("IDR_SKINMAGIC"), _T("SKINMAGIC") ) );
在Dlg类中的OnInitDialog()类中输入:
SetWindowSkin( m_hWnd, "Dialog" ); //这是重点,m_hWnd 是你的主对话框的窗口句柄 SetDialogSkin( "Dialog" ); //是为了给你以后的对话框添加皮肤的!
2.为了工程发布时,无需依赖dll文件
使用dll时,程序发布时需要skinmaigc.dll与程序打包,若使用静态库,则无需依赖dll文件.
具体设置:
1). 常规: 右击项目->属性->配置属性->常规,然后在右边的“项目默认值”中的“MFC的使用”选项中选择“在静态库中使用MFC”,
2). 多线程调试: 右击项目-->属性->配置属性->c/c++->代码生成->运行时库->MTd或MT
如果是Debug的“在静态库中使用MFC”,不要使用MDd,改用MTd,然后编译即可通过。
如果是Release版本“在静态库中使用MFC”,不要使用MD,使用MT;
[MFC美化] MFC使用SkinMagic详解-1