本文講解了在.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的,如下:
新聞熱點
疑難解答