美化你的.net WinForm應用程序

利用.net技術能夠快速開發出應用程序,但是如果應用微軟的那一套技術,做出來的程序大多數程序員恐怕都會有一種千篇一律的感覺:按鈕還是那個按鈕(只是文字不同),文本框還是那個文本框, 下拉列表還是那個下拉列表........跟系統裏的沒有什麼兩樣,不管程序怎麼樣,至少這個界面沒什麼新意。
        誠然,目前也有不少第三方的控件,如Xceed Ultimate Suite、ComponentOne.Studio、Infragistics.NetAdvantage等等,使用這些控件大多需要再花一定時間去掌握這些控件的用法,而且有些做得不是很好,我曾經見過一個商業控件裏面很多是畫出來的,不能像VS.net自帶的控件那樣在IDE上靈活控制,現在給大家展示一個很簡單的換皮膚控件,先不說別的,讓大家看看效果:
        看到上面的界面心動了嗎?告訴大家,我用的都是VS2005的標準控件,實現換皮膚的功能也僅僅是數行代碼而已,也就是說以前熟悉的控件還照常使用。
        先介紹一下這套控件吧,這套控件僅有一個dll(IrisSkin2.dll)文件和一個skin文件夾,skin文件夾下共有22個子文件夾,每個子文件夾其實就是一套界面風格,也就是說我們可以使用22種不同風格。
        實現給界面換皮膚有兩種做法:(一)拷貝法,即使將界面資源夾下所有的文件拷貝到.exe文件所在的位置,然後在程序種通過skinEngine1.SkinFile=fileName(fileName是皮膚文件.ssk文件的位置)來設定界面皮膚,這種做法通常是我們需要在Debug文件夾和Release文件各保存一套皮膚文件,發佈程序的時候也需要附帶這些文件。(二)嵌入資源法,本文就是採用這種辦法實現的,這樣做的好處是發佈程序時(不管是Debug版本或Release版本)時vs自動將皮膚文件編譯進exe文件中,減少程序發佈時文件的個數,而且也不用管程序與皮膚文件的相對位置。
        首先打開VS工具箱,添加皮膚控件組件,如下圖:
        然後在出現的“選擇工具箱項”中點擊“瀏覽”按鈕,然後找到IrisSkin2.dll文件,然後“確定”,關閉對話窗口之後,皮膚控件組件就會出現在你的工具箱上了(具體出現在哪個分組跟你添加時添加哪個組有關),如下圖:
(我不小心加到打印分組去了,大家不要罵我:P)
        好了,現在可以編寫程序測試了,做一個簡單的窗體吧,界面上的控件如上圖所示,然後將皮膚組件拖拽到界面上,之後需要把程序所需要的皮膚資源文件添加進來,這裏我是採用添加資源的辦法。
 
        步驟如下:
(一)在WinForm工程上右鍵單擊“屬性”,在出現的界面中點“資源”選項卡,把所需的皮膚資源文件添加進來(通過“添加現有文件”命令添加皮膚文件),如下圖:
        注意如果該皮膚文件夾下除了*.ssk文件之外,還包含有其它圖片文件,建議將它們也作爲資源添加到項目中。添加完成之後,我們就可以在代碼中通過Properties.Resources.文件名來獲取這些文件的內容了,通過這個方法返回的是文件內容的二進制數據(byte[]),而skinEngine1.SkinStream需要的是一個Stream對象,通過msdn我們可以以這個二進制數據構建一個Stream對象(new MemoryStream(byte[] bytes)),然後賦值給皮膚組件的SkinStream屬性,如果需要換皮膚,重新構建一個皮膚資源文件的Stream對象,然後重新賦值就行了。
 
         界面控件佈局代碼很簡單,就不粘貼了,主要把後臺代碼放在這裏吧(其實也很簡單,不過需要注意,因爲使用了MemoryStream對象,就需要在程序引用程序集部分添加對IO方面的引用:using System.IO;)
 
代碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.IO;
using System.Windows.Forms;

namespace SkinForm
{
        /// <summary>
        /// 說明:這是一個簡單的WinForm應用程序,用來展示如何使用換皮膚控件來實現我們需要的漂亮界面,代碼很簡單。
        /// 作者:周公
        /// 時間:2008-1-8
        /// 首發地址:http://blog.csdn.net/zhoufoxcn
        /// </summary>
        public partial class MainForm : Form
        {
                private MemoryStream memoryStream;
                public MainForm()
                {
                        InitializeComponent();
                        SetSkinFile(Properties.Resources.MacOS);
                }

                private void btnOK_Click(object sender, EventArgs e)
                {
                        if (rbMacOS.Checked)
                        {
                                SetSkinFile(Properties.Resources.MacOS);
                        }
                        else if (rbMP10.Checked)
                        {
                                SetSkinFile(Properties.Resources.MP101);
                        }
                        else if (rbMSN.Checked)
                        {
                                SetSkinFile(Properties.Resources.MSN1);
                        }
                        else if (rbPage.Checked)
                        {
                                SetSkinFile(Properties.Resources.Page);
                        }
                        else if (rbRealOne.Checked)
                        {
                                SetSkinFile(Properties.Resources.RealOne1);
                        }
                        else if (rbVista1.Checked)
                        {
                                SetSkinFile(Properties.Resources.vista1_green1);
                        }
                        else if (rbVista2.Checked)
                        {
                                SetSkinFile(Properties.Resources.Vista2_color11);
                        }
                        else
                        {
                                SetSkinFile(Properties.Resources.XPBlue1);
                        }
                }

                private void SetSkinFile(byte[] bytes)
                {
                        memoryStream=new MemoryStream(bytes);
                        //設置皮膚可以通過兩種方式,一種是指定皮膚文件的位置,
                        //如skinEngine1.SkinFile=fileName(fileName是皮膚文件.ssk文件的位置)
                        //一種是指定皮膚文件的文件流,如本程序所示
                        skinEngine1.SkinStream = memoryStream;
                        
                }
        }
}
程序界面效果如上面所示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章