雪拉比留什么技能:skinmagic改变对话框皮肤【转】

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 05:23:40
skinmagic改变对话框皮肤【转】  

2010-06-06 01:37:21|  分类: 关于美化界面的文 |  标签: |字号大中小 订阅

 

skinMagic是什么?

http://www.appspeed.com

内存资源?

    和一个对话框比较

    用皮肤和不用之前分别是3088,1832说明占用内存资源并不是很多

四个必须的文件?

SkinMagicTrial.dll

SkinMagicTrial.lib

SkinMagicLib.h

corona.smf皮肤文件,可以更换,显示不同的皮肤

改变对话框皮肤的方法:

1.在stdafx.h中:

#include "SkinMagicLib.h"

#pragma comment(lib,"SkinMagicTrial.lib")

2.在BOOL CXXApp::InitInstance()中

函数一开始

VERIFY( 1 == InitSkinMagicLib(AfxGetInstanceHandle(), NULL, NULL, NULL));

VERIFY( 1 == LoadSkinFile("corona.smf"));

在定义对话框(CSkinDlg dlg;m_pMainWnd = &dlg;)之后

显示对话框(int nResponse = dlg.DoModal();)之前:

  

VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" ));

VERIFY( 1 == SetDialogSkin( "Dialog" ) );

!!!进行皮肤设置:

1、将SkinMagicTrial.dll放置在调试目录

2、设置库文件目录,在项目[连接器]的[附加依赖项]中加入库SkinMagicTrial.lib

3、在项目的stdafx.h文件中加入头文件 #include "SkinMagicLib.h"

[创建过程]

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)从皮肤文件中调用皮肤:紧接上句,加入如下代码

VERIFY( 1 == LoadSkinFile("corona.smf"));

2)从资源文件中调用皮肤:

VERIFY(1 == LoadSkinFromResource(NULL,"FUTURA","skin"));

说明:

int LoadSkinFromResource(
HMODULE hModule,                        //包含皮肤文件的模块句柄,若NULL表面在本模块中
char* lpSkinName ,                         //皮肤资源的名称
char* lpType);                                  //资源的类型

3、为窗口添加皮肤:

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)为对话框添加皮肤

在对话框显示之前调用,通常在应用程序初始化函数中调用

     VERIFY( 1 == SetWindowSkin( m_pMainWnd->m_hWnd , "MainFrame" ));

VERIFY( 1 == SetDialogSkin( "Dialog" ) );

     m_pMainWnd->ShowWindow(SW_SHOW);

     m_pMainWnd->UpdateWindow();

说明:

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表明是横竖都是用皮肤 );

4、释放SkinMagic资源

重载应用程序的ExitInstance()函数,添加如下代码:

ExitSkinMagicLib();

 

////////////////////////////////////////

怎样制作皮肤:

椐我所知,设计软件皮肤好像从来不是程序员擅长干的工作。不过我也调查过,很多程序员朋友对皮肤的制作还是满有兴趣的。在这个部分,我专门用我制作的一个软件皮肤为例,从头到尾的给你讲解一遍。其中包括皮肤的画法,皮肤的定制和皮肤的嵌入。如果你有兴
趣,那么就跟着我来做一个皮肤试试吧!

  工预善其事,必先利其器。我们先谈谈制作皮肤需要的工具吧。首先我使用的编程语言是VC++,所以皮肤的嵌入软件,自然也选定是专门制作给VC++的了。我使用的这个软件叫做SkinMagic,有很多朋友通过各种途径得到过这个软件。不过这个软件是个共享软件,而且每一个注册码对应一个软件皮肤,收费高达89美元(我曾经买过几个,吐血!),但是确实非常好使。其实就我所知,很多共享软件的作者都使用这个软件(而且也曾经跟我一样吐过血~)。用它作为皮肤的嵌入软件的原因当然是非常地容易制作啦。(现在已经有破解版本了)
  有了这个工具之后我们还要面有PhotoShop(以下简称PS)来进行皮肤主体的勾画。

  我还要说的是颜色搭配。在这个例子中,因为我很喜欢橙色,所以自然选择橙色作为主体颜色,那么什么颜色能和橙色放在一起比较漂亮?这是问题的关键,我很幸运,著名的NIKE公司的LOGO为我很好的解释了这个原理。

  不难看出灰色,黑色,还有白色都是和橙色很好的搭配在一起,所以我们就选择这几个颜色作为皮肤的制作颜色!

  好了,开始实战!

  第一步,轮廓与着色

  首先,打开你的PS,新建一个文件,宽度为495,高度为406,分辨率为72。然后点击图层菜单,新建图层背景。接着在工具栏里点击油漆桶工具,选择颜色为R=255,B=0,G=255。用油漆桶工具填充背景。我们这样做的目的是填充一个固定的背景色,你看过电影的特技拍摄吧,后面放了一幅大蓝布,然后演员在那里摆POSE,最后再用电脑合成。一个道理,我们也是这样,只不过我们放的是一块大粉布,哈哈。

  下面,我们要绘制一个窗体。在工具栏里点住矩形工具,会看到出现一个下拉菜单,选择圆角矩形工具。在大粉布上画上这个圆角矩形。取名就叫默认的形状1。

  再次使用圆角矩形工具,在刚才的矩形前画一个小一点的矩形,这次我们要拖动鼠标的同时按住减号,然后你会发现我们得到一个窗口外框子。

  接着,我们点击图层窗口,右键选择“形状1”,点选“混和选项”,分别在“斜面和浮雕”,“颜色叠加”,和“描边”上打勾。其中“斜面和浮雕”的参数“大小”为21,“软化”为10。“颜色叠加”的颜色为:R=241, G=112,B=18;“描边”的颜色和刚才的一样,“大小”为1,于是,得到了我们要的窗口外框!

  接下来我们选择工具栏的矩形工具(这次不是圆角矩形了!)画一个长方形,这个长方形要比外框小,比内框大。并将新建的这个图层拖到咱们刚才的圆角矩形的下面,取名也就叫“形状2”。

  还用上面提到的方法,打开“形状2”的“混和选项”,在“内阴影”和“颜色叠加”上打勾。其中“内阴影”的参数“距离”为16,“大小”为5,而“颜色叠加” 的颜色为R=102,G=102,B=102,你瞧我们的窗口做好了!

  好了,把它保存为Orange.psd,然后再转化成BMP格式,我们的窗口皮肤素材就已经做好了!嘿嘿。

  第二步,制作SkinMagic格式皮肤!

  首先,按我刚才说的,到刚才那个网址链接去下载一个SkinMagic,然后解压到你的电脑里。我们使用的是一个叫做“SkinMagicBuilder”的工具软件。它在解压后的SkinMagic的SkinMagicBuilder目录下,是个可执行文件。

  打开这个工具软件后,我们在Object 菜单里选择“Load Image”把刚才存的那个BMP文件装载进来。

  下一步,我们要把这个窗口做活,所谓“做活”就是使这个皮肤能用于任何窗口。这个过程可能有点麻烦。还是点击Object 菜单,选择“Window”的“Frame Window”。在SkinMagic的右侧属性框,把Name改为“Dialog”。然后我们注意到右边的Act iveFrame下有九个属性,翻译成中文他们是“左上方,中上方,右上方,左边,中间,右边,左下方,中下方,右下方”。我们先点击“TopLeft”,在Image Files里选择我们的Orange.bmp。然后你看到,我们画的窗口已经在这个窗口里了。最后你在中间大窗口的左上方看到有一个可以拉动的红点,把它拉开,覆盖在我们的窗口图片的左上方。

  接下来我们按照和刚才同样的方法,把其他八个部分都做好,具体的各个方面参数你可见下表所示。

  填好之后,在Tools菜单里选择“Test”可以测试你制作的皮肤的效果。一个非常非常简单的窗口皮肤已经制作好了。我们把这个文件起名为orange.smf保存起来。

  第三步,在VC++中使用皮肤

  首先我想声明,并不是非要有SkinMagic VC才能添加皮肤,本身VC就有皮肤的调用函数的,比如每一个控件都有一个相关消息映射叫做“DrawItem”,在这里可以对指定的控件装上皮肤。只不过这是非常麻烦的过程,我不推荐。但是如果没有更好的办法,那样也是可以的。比如当你只想给某个按钮加上个皮肤的时候,倒是可以考虑。其他情况下,我们最好采用第三方工具。

  好了,言归正传。我们继续皮肤制作的最后一步,我们先在VC里按照MFC AppWizard建立一个基于Dialog的应用程序,取名为Sample。完全按照向导的默认值就可以了。

  接着我们把刚才保存好的Orange.smf以资源的方式添加到项目中去,资源类型写:“SKIN”,资源名称为:“IDR_SKIN”,注意写的时候一定要加上双引号哦!

  然后我们再到那个SkinMagic包里拷贝些东西,他们分别是:SkinMagicLib.h、SkinMagicLib.lib、DETOURS.lib


  把这三个文件拷贝到你的Sample应用程序的路径下,然后再在VC的Project目录下选择“Add To Project” 菜单的“Files...”。把这三个文件添加到工程中。

  下一步,我们打开Stdafx.h文件,在里面添加上一句:

#include "SkinMagicLib.h"

  接着,在CSampleApp 类里添加一个函数,取名为“InitSkin”。在函数里写入:

void CSampleApp::InitSkin()
{
 //加载皮肤
 VERIFY(1==InitSkinMagicLib(AfxGetInstanceHandle(), "Sample", NULL,NULL ) );
 VERIFY (1==LoadSkinFromResource (
  AfxGetInstanceHandle() , "IDR_SKIN" ,"SKIN") );
  VERIFY( 1 == SetDialogSkin( "Dialog" ) );
 }

  最后在CSampleApp类的InitInstance函数里添加上:

InitSkin();

  按Ctrl+F5,你瞧,皮肤上上去了!哈哈, 厉害了你!并不是很难吧。

  上面我们做的只不过是最简单最简单的上肤了。其实,仔细想想:按钮,菜单,文本框,标签,菜单,Combo等等一大堆的控件都需要上肤的。不过SkinMagic倒是都提供了,我们的做法也和上窗口皮肤大同小异,这里我就不再多说废话了。凭我的经验来讲,一般制作一个完整的皮肤,从PS描绘(有时还需要CorelDraw画)到最后皮肤放到窗口上大约需要3天吧,主要的问题就是要选好搭配的颜色。如果你说你一点美术灵感都没有,那我请你和我一样,找一个非常不错的广告图研究研究;如果你还说一点灵感也没有找到,那只能说明你实在懒得可以。

对原作者内容进行了改动,为了方便学习,我这是收录其中的精华

 文章出自http://hi.baidu.com/cater_dmc/blog/item/5b03b1f431814d2fbc3109d2.html