簡介
我最近注意到很多程序員都不重視他們開發(fā)的軟件的外觀,這主要是因為他們覺得作個漂亮的界面通常很難或需要花很多時間。其實在
.NET中你可以付出很少的精力就使自己的應用程序變得好看些,其中的一個方法就是在窗體的背景上使用漸變色。有時候,一個明快的漸變色就足以使你的產(chǎn)品鶴立雞群了。我在CodeProject上搜了一下,發(fā)現(xiàn)已經(jīng)有一篇由Erdal Halici寫的關(guān)于漸變色窗體的文章。但是我發(fā)現(xiàn)他的解決方法對于這個簡單的任務顯得既復雜又冗長。這也就促成我寫這篇文章。
這篇文章主向您展示了處理這個問題的簡單方法,而且還提供了一個很小的基類使你可以在應用程序中直接使用。我保證,你需要作的唯一一件事就是設(shè)置顏色。這總不困難吧?:)
女士們,先生們,打開您的Visual Studio吧!
好的、壞的和漸變的
好的
的確有些人在花時間為自己的應用程序選個合適的顏色。尋找一個和諧的背景顏色的確可以使他們的產(chǎn)品顯得突出而且容易被認可。但是我只能為它鼓掌,然后反問:為什么不能更進一步,選擇兩種顏色呢?:)
壞的
還有些人甚至從不關(guān)心選擇顏色的問題。他們的應用程序只是使用乏味的灰色作為背景色,這個你肯定在不少應用程序見過了。那些設(shè)計者應該為此羞愧!(譯注:我汗哪!照這么說我該去跳樓了。)
漸變的
同時你也知道有人使用漸變色作背景,在讀了這篇文章之后,我相信你也能成為其中之一。你所作的就是選擇顏色,但是你的應用程序卻會表現(xiàn)出特別的視覺效果,知道為什么嗎?因為用戶喜歡這樣的視覺效果。
打造BaseGradientForm
首先要了解的:
BaseGradientForm與一個具有一些預定義屬性和方法的常規(guī)窗體相比并沒多什么東西。你按照通常的方法創(chuàng)建一個窗體,唯一要作的事就是添加一些屬性。
三個屬性和一個方法:
我們需要添加三個屬性:
-Color1:第一個漸變色(譯注:即窗體左側(cè)的顏色)
-Color2:第二個漸變色(譯注:即窗體右側(cè)的顏色)
-ColorAngle:漸變度(即Color2與Color1之間的連線與X軸正向夾角)
這只是三個普通的屬性,像這樣添加屬性你可能已經(jīng)作一千遍了吧。
當然,這里還是有個不同的地方:當我們設(shè)置一個值的時候(通過代碼,或者通過派生窗體設(shè)計期的屬性設(shè)置),我們需要窗體重繪自己。要達到這個目標,我們需要調(diào)用一個很小的方法來告訴我們的窗體(或者是控件,當我們要在控件上使用漸變色時)去重繪自己。那個被調(diào)用的方法就是使窗體無效(Invalidate)的方法。
2 public Color Color1
3 {
4 get { return _Color1; }
5 set
6 {
7 _Color1 = value;
8 this.Invalidate(); // Tell the Form to repaint itself
9 }
10 }
11
12 //窗體右側(cè)顯示的顏色
13 public Color Color2
14 {
15 get { return _Color2; }
16 set
17 {
18 _Color2 = value;
19 this.Invalidate(); // Tell the Form to repaint itself
20 }
21 }
22
23 //顏色漸變度
24 public float ColorAngle
25 {
26 get { return _ColorAngle; }
27 set
28 {
29 _ColorAngle = value;
30 this.Invalidate(); // Tell the Form to repaint itself
31 }
32 }
33
像畢加索(picasso)那樣繪畫
不論什么時候窗體調(diào)用重繪函數(shù),都是因為我們調(diào)用使窗體無效的函數(shù)(Invalidated call)或者操作系統(tǒng)調(diào)度而發(fā)生的,這將會觸發(fā)兩個事件(Paint或PaintBackground)。如果你要在這兩個事件的處理函數(shù)中添加代碼也沒什么關(guān)系,不過因為我們是有邏輯思維的人,所以我們選擇重寫(override)PaintBackground。
在這個方法中我們在窗體上繪制了一個矩形區(qū)域,這個區(qū)域與我們的窗體大小相同。這樣就可以覆蓋整個窗體,變成窗體背景。
2 {
3 // Getting the graphics object
4 Graphics g = pevent.Graphics;
5
6 // Creating the rectangle for the gradient
7 Rectangle rBackground = new Rectangle(0, 0, this.Width, this.Height);
8
9 // Creating the lineargradient
10 System.Drawing.Drawing2D.LinearGradientBrush bBackground
11 = new System.Drawing.Drawing2D.LinearGradientBrush(rBackground, _Color1, _Color2, _ColorAngle);
12
13 // Draw the gradient onto the form
14 g.FillRectangle(bBackground, rBackground);
15
16 // Disposing of the resources held by the brush
17 bBackground.Dispose();
18 }
Bugs
?當你測試編寫好的代碼的時候,你將發(fā)現(xiàn)當窗口大小改變的時候會出現(xiàn)一個很奇怪的現(xiàn)象。當那個東西(critters,譯注:應該指操作系統(tǒng))接管這個事件的時候并不會發(fā)生,它的發(fā)生是因為窗體大小發(fā)生變化時程序并沒有捕獲“Repaint Yourself Event”?磥砦覀円幚硭械氖虑榱耍皇菃 :) ?幸運的是,我們不需要通過重寫Resize Event完成這個困難的任務,我們只用在BaseFormGradient的構(gòu)造函數(shù)中加上這么一行代碼告訴窗體當大小改變時重繪就行了。
最后記住一點:充分享受生活吧。One last note to all : Enjoy Life To The Fullest !)
使用這個代碼
基窗體(BaseForm)
當你把BaseFormGradient.cs添加到項目之后,讓你的窗體繼承“BaseFormGradient”就行了。(譯注:添加之后必須先編譯BaseFormGradient再作繼承)
使用漸變色
然后你所需要作的事情就是設(shè)置顏色和漸變度。沒錯,我可以很負責的說,這就是你全部要作的事。
ps:這篇文章比較短,也不是很難,提到的方法比較有意思,所以就選了這一篇。作者的語氣很幽默,但也很羅嗦,有些地方就不好翻譯。另外有兩個問題在后面的答復中提到:1、如何將這種風格應用到其他控件上(Button、TabControl等),總不能每個控件都按相同的方法作一遍吧!2、它實現(xiàn)了左上到右下的漸變效果,但我想把它變成從左向右的漸變效果該怎么辦?
對于第一個問題,作者也沒提出什么好辦法。第二個問題作者通過一個坐標變換解決了問題,我看的不是太明白,有興趣的可以看原文。
代碼下載http://lzcarl.cnblogs.com/Files/GradientForms_EasyWay_src.zip。