使用SkinMagic美化MFC的窗口跟美化对话框很相似,但是由于我是新手,对于这些操作不是太熟,所以还是有必要记录一下这段历程,万事开头难嘛!!对于这篇文章和使用《SkinMagic美化MFC对话框》中即使相同的步骤,我还是在这里详细的记录下来,意图熟能生巧。
SkinMagic的开发包可以在http://download.csdn.net/source/3292405上面下载
一、 新建一个MFC单文档应用程序Skin_Windows。
二、 将SkinMagicLib.h,SkinMagicTrial.dll,SkinMagicTrial.lib,和皮肤文件"corona.smf"添加到当前目录;
三、 在Skin_Windows.cpp中添加:
#include "SkinMagicLib.h"
#pragma comment(lib, "SkinMagicTrial.lib")
四、 初始化SkinMagic库:
要使用SkinMagic,这一步必不可少。
在应用程序类的InitInstance()函数中行加入如下代码(粗体部分):
CWinApp::InitInstance();
VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL));
说明: intInitSkinMagicLib( //初始化SkinMagic工具库
HINSTANCE hInstance, //应用程序句柄
char* szApplication , //皮肤文件中定义的应用程序名,置为NULL即可
char* szRegCode, //SkinMagic的使用注册码。若无置为NULL
char* szReserved2 //保留位,为NULL );
即添加代码后的表面形式是:
BOOLCSkin_WindowsApp::InitInstance()
{
VERIFY( 1 ==InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL ));
。。。。其他的一连串代码
}
五、 调入皮肤文件:
皮肤的调用有两种方法,一是直接从皮肤文件中调用,另一种方法是从资源文件中调用,
分别说明如下:
1)从皮肤文件中调用皮肤:
紧接上句,加入如下代码VERIFY(1 == LoadSkinFile("corona.smf"));
2)从资源文件中调用皮肤:
VERIFY(1 ==LoadSkinFromResource(NULL,(LPCTSTR)IDR_SKINMAGIC1,"SKINMAGIC")));
int LoadSkinFromResource( HMODULEhModule, //包含皮肤文件的模块句柄,若NULL表明在本模块中
char* lpSkinName , //皮肤资源的名称
char* lpType); //资源的类型
在这里采用第二种方法,添加后的表面形式是:
BOOLCSkin_WindowsApp::InitInstance()
{
VERIFY( 1 ==InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL )); //这是在上一步骤中添加的代码
VERIFY(1 ==LoadSkinFromResource(NULL,(LPCTSTR)IDR_SKINMAGIC1, "SKINMAGIC"));//本步骤需要添加的代码
。。。一连串其他的代码
}
注意,在从资源加载皮肤函数LoadSkinFromResource()的第二个和第三个参数是皮肤资源的名称和资源的类型,而皮肤资源直到第八步骤才加载到当前工程中,并且加载时,指定的资源类型是SKINMAGIC,里面的资源默认名是SKINMAGIC1。
六、 为窗口添加皮肤:
为标准窗口(拥有标题栏、系统菜单、可变大小等特征,比如文档/视图结构和有菜单的对话框)添加皮肤,通常用于主窗口。
在应用程序类的InitInstance()函数的底部加入如下代码:
VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame"));
m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow();
说明:intSetWindowSkin( HWND hWnd, //要使用皮肤的窗口句柄
char* lpSkinName //为skinFrameWnd对象指定的名称);
添加这段代码后的程序表面形式是:
BOOLCSkin_WindowsApp::InitInstance()
{
VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL)); //这是在上一步骤中添加的代码
VERIFY(1 == LoadSkinFromResource(NULL,(LPCTSTR)IDR_SKINMAGIC1,"SKINMAGIC"));//这是在上一步骤中添加的代码
。。。一连串其他的代码
VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame")); //本步骤需要添加的代码
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
七、 在CSkin_WindowsApp类中重载虚函数ExitInstance()添加:
// TODO: Add your specialized code hereand/or call the base class
//===SkinMagic===
// 释放SkinMagic库申请的内存
ExitSkinMagicLib();
//===SkinMagic=
即:BOOLCSkin_WindowsApp::ExitInstance()
{
ExitSkinMagicLib();
returnCWinApp::ExitInstance();
}
注意添加上面的代码在除此编译的时候,会提示出现错误,因为ExitInstance()还没有在CSkin_Windows中定义,去定义就行了。。。
八、 修改资源文件
九、 添加库文件
の、、、、最后这两部还是参照《SkinMagic美化MFC对话框》吧,步骤一模一样,时间不早了。
、、、不过,现在倒是觉得第八步应该放在前面一点,至少应该在第五步调入皮肤文件之前。因为调入皮肤文件的函数
int LoadSkinFromResource( HMODULE hModule, //包含皮肤文件的模块句柄,若NULL表明在本模块中
char* lpSkinName , //皮肤资源的名称
char* lpType); //资源的类型
中的皮肤资源名称是在第八步之后才生成的!!IDR_SKINMAGIC1是在 第八步骤里才出来的!!!
下面是美化后。窗口的效果: