本文讲解了在.net中美化界面程序的方法:
 
 
 






        看到上面的界面心动了吗?告诉大家,我用的都是VS2005的标准控件,实现换皮肤的功能也仅仅是数行代码而已,也就是说以前熟悉的控件还照常使用。
        先介绍一下这套控件吧,这套控件仅有一个dll(IrisSkin2.dll)文件和一个skin文件夹,skin文件夹下共有22个子文件夹,每个子文件夹其实就是一套界面风ge,也就是说我们可以使用22种不同风ge。
        实现给界面换皮肤有两种做法:(一)拷贝法,即使将界面资源夹下所有的文件拷贝到.exe文件所在的位置,然后在程序种通过skinEngine1.SkinFile=fileName(fileName是皮肤文件.ssk文件的位置)来设定界面皮肤,这种做法通常是我们需要在Debug文件夹和Release文件各保存一套皮肤文件,发布程序的时候也需要附带这些文件。(二)嵌入资源法,本文就是采用这种办法实现的,这样做的好处是发布程序时(不管是Debug版本或Release版本)时vs自动将皮肤文件编译进exe文件中,减少程序发布时文件的个数,而且也不用管程序与皮肤文件的相对位置。
        首先打开VS工具箱,添加皮肤控件组件,如下图:

        然后在出现的“选择工具箱项”中点击“浏览”按钮,然后找到IrisSkin2.dll文件,然后“确定”,关闭对话窗口之后,皮肤控件组件就会出现在你的工具箱上了(具体出现在哪个分组跟你添加时添加哪个组有关),如下图:
 


(我不小心加到打印分组去了,大家不要骂我:P)
        好了,现在可以编写程序测试了,做一个简单的窗体吧,界面上的控件如上图所示,然后将皮肤组件拖拽到界面上,之后需要把程序所需要的皮肤资源文件添加进来,这里我是采用添加资源的办法。
 
        步骤如下:
(一)在WinForm工程上右键单击“属性”,在出现的界面中点“资源”选项卡,把所需的皮肤资源文件添加进来(通过“添加现有文件”ming令添加皮肤文件),如下图:

        注意如果该皮肤文件夹下除了*.ssk文件之外,还包含有其它图片文件,建议将它们也作为资源添加到项目中。添加完成之后,我们就可以在代码中通过Properties.Resources.文件名来获取这些文件的内容了,通过这个方法返回的是文件内容的二进制数据(byte[]),而skinEngine1.SkinStream需要的是一个Stream对象,通过msdn我们可以以这个二进制数据构建一个Stream对象(new MemoryStream(byte[] bytes)),然后赋值给皮肤组件的SkinStream属性,如果需要换皮肤,重新构建一个皮肤资源文件的Stream对象,然后重新赋值就行了。
 
         界面控件布局代码很简单,就不粘贴了,主要把后台代码放在这里吧(其实也很简单,不过需要注意,因为使用了MemoryStream对象,就需要在程序引用程序集部分添加对IO方面的引用:using System.IO;) 
  代码如下:
 
01 | 
			using System;   | 
		
02 | 
			using System.Collections.Generic;   | 
		
03 | 
			using System.ComponentModel;   | 
		
04 | 
			using System.Data;   | 
		
05 | 
			using System.Drawing;   | 
		
06 | 
			using System.Text;   | 
		
07 | 
			using System.IO;   | 
		
08 | 
			using System.Windows.Forms;   | 
		
09 | 
			    | 
		
10 | 
			namespace SkinForm   | 
		
11 | 
			{   | 
		
12 | 
			        /// <summary>   | 
		
13 | 
			        /// 说明:这是一个简单的WinForm应用程序,用来展示如何使用换皮肤控件来实现我们需要的漂亮界面,代码很简单。   | 
		
14 | 
			        /// 作者:周公   | 
		
15 | 
			        /// 时间:2008-1-8   | 
		
16 | 
			        /// 首发地址:http://blog.csdn.net/zhoufoxcn   | 
		
17 | 
			        /// </summary>   | 
		
18 | 
			        public partial class MainForm : Form   | 
		
19 | 
			        {   | 
		
20 | 
			                private MemoryStream memoryStream;   | 
		
21 | 
			                public MainForm()   | 
		
22 | 
			                {   | 
		
23 | 
			                        InitializeComponent();   | 
		
24 | 
			                        SetSkinFile(Properties.Resources.MacOS);   | 
		
25 | 
			                }   | 
		
26 | 
			    | 
		
27 | 
			                private void btnOK_Click(object sender, EventArgs e)   | 
		
28 | 
			                {   | 
		
29 | 
			                        if (rbMacOS.Checked)   | 
		
30 | 
			                        {   | 
		
31 | 
			                                SetSkinFile(Properties.Resources.MacOS);   | 
		
32 | 
			                        }   | 
		
33 | 
			                        else if (rbMP10.Checked)   | 
		
34 | 
			                        {   | 
		
35 | 
			                                SetSkinFile(Properties.Resources.MP101);   | 
		
36 | 
			                        }   | 
		
37 | 
			                        else if (rbMSN.Checked)   | 
		
38 | 
			                        {   | 
		
39 | 
			                                SetSkinFile(Properties.Resources.MSN1);   | 
		
40 | 
			                        }   | 
		
41 | 
			                        else if (rbPage.Checked)   | 
		
42 | 
			                        {   | 
		
43 | 
			                                SetSkinFile(Properties.Resources.Page);   | 
		
44 | 
			                        }   | 
		
45 | 
			                        else if (rbRealOne.Checked)   | 
		
46 | 
			                        {   | 
		
47 | 
			                                SetSkinFile(Properties.Resources.RealOne1);   | 
		
48 | 
			                        }   | 
		
49 | 
			                        else if (rbVista1.Checked)   | 
		
50 | 
			                        {   | 
		
51 | 
			                                SetSkinFile(Properties.Resources.vista1_green1);   | 
		
52 | 
			                        }   | 
		
53 | 
			                        else if (rbVista2.Checked)   | 
		
54 | 
			                        {   | 
		
55 | 
			                                SetSkinFile(Properties.Resources.Vista2_color11);   | 
		
56 | 
			                        }   | 
		
57 | 
			                        else  | 
		
58 | 
			                        {   | 
		
59 | 
			                                SetSkinFile(Properties.Resources.XPBlue1);   | 
		
60 | 
			                        }   | 
		
61 | 
			                }   | 
		
62 | 
			    | 
		
63 | 
			                private void SetSkinFile(byte[] bytes)   | 
		
64 | 
			                {   | 
		
65 | 
			                        memoryStream=new MemoryStream(bytes);   | 
		
66 | 
			                        //设置皮肤可以通过两种方式,一种是指定皮肤文件的位置,   | 
		
67 | 
			                        //如skinEngine1.SkinFile=fileName(fileName是皮肤文件.ssk文件的位置)   | 
		
68 | 
			                        //一种是指定皮肤文件的文件流,如本程序所示   | 
		
69 | 
			                        skinEngine1.SkinStream = memoryStream;   | 
		
70 | 
			                            | 
		
71 | 
			                }   | 
		
72 | 
			        }   | 
		
73 | 
			} | 
		
程序界面效果如上面所示。
 
本文提到的皮肤组件可以到:http://download.csdn.net/user/zhoufoxcn/下载。
 
        20081月10日答广大朋友的疑问:
(一)有的朋友怀疑在MDI窗口中是否可以很好运用,我觉得是可以的,可以在MDI子窗口中设置它的皮肤文件和父窗口一致,这样就做到了整个系统中所有界面皮肤风ge一致了。
(二)原来我自己曾怀疑在系统对话框中不能很好运行,刚刚证实了一下,是可以的,无需再做任何特殊设置。运行情况如下:
 

这是在默认皮肤为MacOS的情况下弹出的颜色对话框,也是MacOS风ge的,如下:
新闻热点
疑难解答