[MFC美化] SkinMagic使用详解1- SkinMagic使用流程
【SkinMagic使用流程】
1.工程配置SkinMagic相关文件
2.初始化SkinMagic皮肤文件,窗体加载皮肤
3.释放皮肤资源
特别声明,SkinMagic要是破解版的,如果不是,可能需要先破解!
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,
注意:可能会报IDR_SKIN_CORONA为未声明的标识符,这时需要添加头文件”Resource.h“
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();
建议:
1. 在App类中InitInstance函数中先初始化一下Skinamgic,然后加载皮肤库:
VERIFY( 1 == InitSkinMagicLib( AfxGetInstanceHandle(), _T("SCRIBBLE") , NULL, NULL ) );//初始化SkinMagic
VERIFY( 1 == LoadSkinFile(_TEXT("AlphaOS.smf")));//加载皮肤文件
然后在Dlg类中的OnInitDialog换肤:
SetDialogSkin(_T("Dialog")));
附件:见文件
有关链接:
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