第一步:如何使用SkinMagic
使用步骤:
1.把SkinMagicLib.h, SkinMagicLibMT6.lib, SkinMagicLibMD6.lib放到你的VC6工程目录下
2.在StdAfx.h中添加#include "SkinMagicLib.h"
3。在工程设置中添加对应的库
特别注意: 1.使用dll时,程序发布时需要skinmaigc.dll与程序打包 2.若使用静态库,则无需依赖dll文件。具体做法是: 前提条件1:在project/settings/general/ 选择了use MFC in a Static Lirary,此时对于debug版本和 release版本,都必须使用静态库:SkinMagicLibMT6.lib。 1) debug版本:Project/Setting的C++ / Code Generation下选择:“Debug Multithreaded”。 2)release版本:选择:“Multithreaded” 前提条件2:在project/settings/general/ 选择了use MFC in a Shared DLL,此时对于debug版本和 release版本都必须使用静态库:SkinMagicLibMD6.lib。 3) debug版本:Project/Setting的C++ / Code Generation下选择:“Debug Multithreaded DLL”。 4) release版本:选择:“Multithreaded DLL” |
其中的MT代表multithreaded,而MD代表multithreaded DLL,需要在 msdev 的Project/Setting的C++ / Code Generation标签下选择,如果你的工程要用MT类型的静态库,则debug版要选择"Debug Multithreaded",release 版要选择"Multithreaded";如果要用MD类型的静态库,则debug版需要选择"Debug Multithreaded DLL",release 版要选择"Multithreaded DLL"。 引自http://www.pediy.com/bbshtml/BBS6/pediy6615.htm |
3.如何使用皮肤文件
1)初始化SkinMagic库:
要使用SkinMagic,这一步必不可少。在应用程序类的InitInstance()函数中行加入如下代(粗体部分 )
CWinApp::InitInstance();
VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL , NULL, NULL ));
说明:
int InitSkinMagicLib( //初始化SkinMagic工具库
HINSTANCE hInstance, //应用程序句柄
char* szApplication , //皮肤文件中定义的应用程序名,置为NULL即可
char* szRegCode, //SkinMagic的使用注册码。若无置为NULL
char* szReserved2 //保留位,为NULL
);
2)调入皮肤文件:
皮肤的调用有两种方法,一是直接从皮肤文件中调用,另一种方法是从资源文件中调用,分别说明如下:
1) 从皮肤文件中调用皮肤:紧接上句,加入如下代码
将资源文件放到工程目录的res文件下。比如要加的资源文件为Camera.smf。需要在LoadSkinFile函数中指定文件的路径
VERIFY( 1 == LoadSkinFile( "E ://Camera//res//Camera.smf);
2)从资源文件中调用皮肤:
VERIFY(1 == LoadSkinFromResource(NULL,"FUTURA","skin"));
int LoadSkinFromResource(
HMODULE hModule, //包含皮肤文件的模块句柄,若NULL表面在本模块中
char* lpSkinName , //皮肤资源的名称
char* lpType); //资源的类型
如下所示:
//加载皮肤库 VERIFY( 1 == InitSkinMagicLib( AfxGetInstanceHandle(), "Demo" , NULL,NULL ) ); //从文件加载资源 VERIFY( 1 == LoadSkinFile( "Devior.smf" )); |
这里添加了皮肤库和皮肤文件之后,就要根据我们的需要给窗口,对话框,和单独的对话框添加皮肤
4.为窗口添加皮肤
1)为标准窗口(拥有标题栏、系统菜单、可变大小等特征,比如文档/视图结构和有菜单的对话框)添加皮肤,通常用于主窗口。在应用程序类的InitInstance()函数的底部加入如下代码:
VERIFY( 1 == SetWindowSkin(m_hWnd , "MainFrame" ));
说明:
int SetWindowSkin(
HWND hWnd, //要使用皮肤的窗口句柄
char* lpSkinName //为skinFrameWnd对象指定的名称
);
2)为对话框添加皮肤
在对话框显示之前调用,通常在应用程序初始化函数中调用
VERIFY( 1 == SetWindowSkin(m_hWnd , "MainFrame" ))
VERIFY( 1 == SetDialogSkin( "Dialog" ) );
说明:
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表明是横竖都是用皮肤
);
5.释放SkinMagic资源
重载应用程序的ExitInstance()函数,添加如下代码:
ExitSkinMagicLib();
上面是使用皮肤的方法。
第二步如何使用SkinMagic工具制作皮肤
在网上也没有找到怎么制作皮肤文件的文章,估计是不是太简单了,没有人写。我学了快一周了。总算出了点成果。
我们的项目有点难度。我们的主对话框我是一用了shapewnd添加了资源。但是对于属性对话框怎么都不对。
后来我采取了办法是,对主对话框,
添加shapewnd资源SetShapeWindowSkin(m_hWnd,"MainDlg");
在sheet对话框中添加在 SetSingleDialogSkin(m_hWnd,"SettingDlg");
这是一个framewnd的对话框。我自己做了一个,但是背景老加不对,我就从网上找了一个 Prosheet的例子。研究了一下它资源文件,然后添加到自己项目里,但是报错,后来同事给帮忙,原来少了DLL 。晕倒了。犯了低级的错误。现在我没有把framewnd搞明白,为啥背景图不显示呢?只好用Prosheet的例子资源进行修改,改为我们的自己的,这个只是针对对话框的,每个属性页的都是一样的显示内容。根据的我的试验结果,我这样做可以行的通的。回头让美工作图。效果不是很好的。
Shapewnd 很简单的。只要换背景图,对于控件只需要将控件的ID和皮肤里的ID绑定就可以了,调整一下控件的位置。
下面就网上的framewnd 制作的文章,参考一下。
使用SkinMagic工具为对话框换肤的基本方法
一.制作皮肤文件
首先要学会使用SkinMagicBuilder工具制作皮肤文件。
1.新建/删除皮肤窗口
SkinMagic Toolkit中有两种方法新建皮肤窗口:
(1)使用菜单栏中的“Object”项,选择“Window”-〉“SkinFrameWindow”即可;
(2) 使用Skin Object工具栏。首先选中“View”菜单下的“Object Bar”,使Skin Object工具栏显示在窗口中。接着在工具栏中选中SkinMagic文件夹下的Skin Object,右击鼠标,在弹出的快捷菜单中选择 “Window”-〉“SkinFrameWindow”即可。
删除皮肤窗口的方法是选中要删除的窗口,选择Edit菜单下的Delete选项。
SkinMagic在所有皮肤窗口中使用了一种图像切割方法,在这里我们称之为九宫图。所谓九宫图,就是把一个对象分成左上(1)(TopLeft)、中上(2)(MiddleTop)、右上(3)(TopLeft)、左中(4)(MiddleLeft)、客户区(5)(Client)、右中(6)(MiddleRight)、左下(7)(BottomLeft)、中下(8)(BottomMiddle)、右下(9)(BottomRight)九个部分。其中每一宫的大小可以通过设置九宫图的参数来调整。
2. 设置皮肤窗口的大小
在工作区的皮肤窗口上双击鼠标左键,弹出设置窗口。
3. 设置皮肤窗口的属性值
SkinMagic默认设置将Object Inspector工具栏显示在窗口中。如果不在,可以通过选中“View”菜单下的“Object Inspector”项来实现。
4. 皮肤窗口的九宫图片设置
在为皮肤窗口设置九宫图片之前,需要添加图片对象。添加方法有多种,仅举一种:选择Object菜单下的Load Image 项,选择图片(不支持jpg格式)进行添加。添加以后,图片会显示在Skin Object工具栏的Image Object项目下。删除图片方法也有多种,仅举一种:在Skin Object选中图片名,右击鼠标,在弹出的快捷菜单中选择Unload Image 项即可。
图片加载之后,编辑程序主界面或者控件时,点击图片属性值区域,弹出图片编辑窗口。在图片编辑窗口中,可以拖拽来确定选中区域,可以设置是否拉伸属性,对于颜色单一、图案单一的图片,可以选择拉伸属性,否则最好使用不可拉伸属性。
5.添加皮肤控件
添加皮肤控件的方法有两种:
(1)在Skin Object工具栏中要添加控件的皮肤窗口,右击鼠标,在弹出的快捷菜单中选择Standard Control,在子菜单中选择相应的控件名称即可。
(2)另一个方法是选择菜单栏中的Object菜单选项,在下拉菜单中选择Standard Control,在子菜单中选择相应的控件名称即可。
二、 使用皮肤文件
完成皮肤文件的制作后,保存成.smf文件,存放到工程的资源目录下,实现界面换肤。具体步骤如下:
(1) 将SkinMagic Toolkit中的头文件SkinMagiclib.h添加到当前工作区中。
(2) 使用SkinMagic Toolkit提供的库:SkinMagic.dll,SkinMagic.lib(Unicode编码下使用
SkinMagicU.lib和SkinMagicU.dll)。
(3)在工程的对话框初始化函数中初始化库,方法:
InitSkinMagicLib( AfxGetInstanceHandle(), _T( "AutoRun" ), NULL, NULL ) );
括号中的内容依次是:当前程序的句柄、工程名、序列号(可以为NULL)。
(4)将皮肤文件以资源的形式引入当前工程,首先在 Resource View 中点击 Import 菜单引入几个已经制
作好的.SMF二进制皮肤文件,放在相同的"SKINMAGIC"文件夹下,分别给起一个名字。在工程对话框源文件
中添加如下代码来下载皮肤资源文件:
LoadSkinFromResource( AfxGetInstanceHandle(),_T( "AUTORUN" ), _T( "SKINMAGIC" ) );
括号中的内容依次是:当前程序的句柄、为皮肤文件起的名字、资源中的名称。
另外:皮肤文件也可以以文件的形式载入当前工程,首先将文件放在当前工程文件夹下,在工程对话框
源文件中添加如下代码:
LoadSkinFile("corona.smf");
括号中的内容为皮肤文件名。
(5)为对话框换肤,在工程对话框初始化函数中为所有的对话框换肤,代码如下:SetDialogSkin(
"Dialog" );
也可以为每一个对话框分别设置皮肤,在每个对话框的初始化函数中添加如下代码:
SetSingleDialogSkin( m_hwhd,",Dialog" ) ;
括号中的内容为当前对话框的句柄、对应对话框的皮肤窗口的名字。( 在制作的皮肤文件中给
SkinFrameWindow起的名字 )
(6)在程序结束时,释放SkinMagic的资源,在当前工程对话框退出函数中添加如下代码:
ExitSkinMagicLib();
补充:
1,如果新建的SkinFrameWindow加载的图片为1024*768,SkinMagicBuilder工具的客户区窗口不能全部显示,客户区的滚动条不起作用。
2,使用SkinMagic工具为滚动条换肤
创建SkinScrollBar对象,名字任意,ControllID为0。之后,程序所有带滚动条的控件,滚动条自动换肤。