首页 > 代码库 > [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