VS.NET實現(xiàn)漸變色(Gradient)窗體

2010-08-28 10:49:52來源:西部e網(wǎng)作者:

簡介

 


我最近注意到很多程序員都不重視他們開發(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)的方法。

 

 

 1        //窗體左側(cè)顯示的顏色
 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ā)兩個事件(PaintPaintBackground)。如果你要在這兩個事件的處理函數(shù)中添加代碼也沒什么關(guān)系,不過因為我們是有邏輯思維的人,所以我們選擇重寫(overridePaintBackground

在這個方法中我們在窗體上繪制了一個矩形區(qū)域,這個區(qū)域與我們的窗體大小相同。這樣就可以覆蓋整個窗體,變成窗體背景。

 1        protected override void OnPaintBackground(PaintEventArgs pevent)
 2        {
 3            // Getting the graphics object
 4            Graphics g = pevent.Graphics;
 5
 6            // Creating the rectangle for the gradient
 7            Rectangle rBackground = new Rectangle(00this.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ù)中加上這么一行代碼告訴窗體當大小改變時重繪就行了。

this.SetStyle( ControlStyles.ResizeRedraw, true );

最后記住一點:充分享受生活吧。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

關(guān)鍵詞:VS.NET

贊助商鏈接: