上篇部落格說了些題外話,為什麼偏偏在這時候討論事件和委託。對於事件和委託是.NET程式猿必須掌握的一堂課,是程式猿踏入設計而不是編寫的裡程碑,瞭解了事件的形成就能夠使用代碼編寫動態建立的事件,而學會了委託才能真正的踏入設計的階段。
好了回到我們文章的正題,從番外篇回來要開始我們GDI+的旅程啦,今天我們對GDI+的基本架構屢屢,並利用GDI+的幾個基本的類來繪製一個圓柱形,重點在於通過執行個體來區分Graphics和GraphicsPath兩個類之間的關係。
GDI+常用類的劃分,通過你還不能瞭解GDI+的奧秘,好戲在後頭……
也許你要問為什麼會有Graphics和GraphicsPath兩種類的劃分,是啊為什麼呢?要從根本上區分兩者,首先要看它們的作用,Graphics是在System.Drawing命名空間下的一個類,主要用於圖形介面的顯示,另外也封裝了多種圖形的繪製方法,而且還包括了圖形的剪輯。
接著來看GraphicsPath類,該類和Graphics類最大的區別是兩者分屬的命名空間不同,GraphicsPath類是System.Drawing.Drawing2D命名空間下的類,提供了一系列相互串連的直線和曲線,它在繪圖功能比Graphics類更優,而且靈活。
為什麼會有兩種Brush類和SolidBrush類顏色類?因為SolidBrush是Brush類的一個子類,Brush是一個抽象類別,所以在具體的方法中使用時只能通過執行個體化SolidBrush類來實現顏色的填充。
相同Bitmap和image也是一種父子關係,Bitmap繼承了抽象的父類image,為使用者提供了處理由像素資料定義的映像。
Note:在編程時,我們往往把需要把繪製的映像儲存在一個Bitmap對象中,使映像保持不變。
這裡為什麼要說地區類,它並不屬於圖形繪製類,是的它指定了一個路徑地區,使得我們可以對地區進行操作,靈活的使用該類可以在原圖中擷取我們想要的地區,另外也提供了地區的放大和縮放等功能。
上面把常用的GDI+編程中使用的類分類匯總了下, 但有些類沒有涉及到,如 Rectangle 和 Point 等類可封裝 GDI+ 基元, Pen 類用於繪製直線和曲線。
上面我們總結了幾種類,接下來做一個執行個體,使用GDI+繪製一個圓柱形,在實戰中深入體會幾種類的使用方法。
繪製思路:首先使用GraphicsPath類來繪製一個閉合的圖形,然後繪製圓柱的上底和下底的橢圓。
清單一:繪製圓柱的閉合地區,使用GraphicsPath類繪製閉合地區,並使用CloseFigure方法閉合該地區,最後使用Graphics類來填充顯示該地區。
private void DrawClosedFigure(PaintEventArgs e){ Graphics g = e.Graphics; GraphicsPath gp = new GraphicsPath(); Point p = new Point(20, 20); //矩形所在的正方形的起始點座標 Size s = new Size(540, 380); //圓柱所在的正方形的大小 float flaHeight = (float)s.Width / (float)6.75; //擷取上方橢圓的高 float flaRecHeight = (float)s.Height / (float)2.62; //擷取上方橢圓所在矩形的高的一半 int intHeight = Convert.ToInt16(Math.Round(flaHeight, 0)); int intRecHeight = Convert.ToInt16(Math.Round(flaRecHeight, 0)); Rectangle rect = new Rectangle(p, s); //建立一個矩形地區,用來繪製圓柱 gp.AddArc(rect.X, rect.Y + intHeight, s.Width, intRecHeight, 180, 180); //繪製圓柱形的上半圓 gp.AddArc(rect.X, rect.Y + rect.Height, s.Width, intRecHeight, 0, 180); //繪製圓柱形的下半圓 gp.CloseFigure(); //閉合該地區 g.SmoothingMode = SmoothingMode.HighQuality; //設定邊框圓滑 g.DrawPath(new Pen(Color.FromArgb(213, 204, 186), 6), gp); //在繪畫板上繪製該畫板地區,繪製出想要的邊界 g.FillPath(new SolidBrush(Color.FromArgb(245, 237, 229)), gp); //填充畫板地區的內部}
清單二:繪製圓柱形的上底和下底的橢圓,這裡繪製的上底沒有填充,並且不是閉合的橢圓,這樣看起來更形象。
private void DrawBottom(PaintEventArgs e){ Graphics g = e.Graphics; Point p = new Point(20, 20); //矩形所在的正方形的起始點座標 Size s = new Size(540, 380); //圓柱所在的正方形的大小 float flaHeight = (float)s.Width / (float)6.75; //擷取上方橢圓的高 float flaRecHeight = (float)s.Height / (float)2.62; //擷取上方橢圓所在矩形的高的一半 int intHeight = Convert.ToInt16(Math.Round(flaHeight, 0)); int intRecHeight = Convert.ToInt16(Math.Round(flaRecHeight, 0)); Rectangle rect = new Rectangle(p, s); //建立一個矩形地區,用來繪製圓柱 g.FillEllipse(new SolidBrush(Color.FromArgb(213, 204, 186)), rect.X - 2, rect.Y + rect.Height, s.Width + 3, intRecHeight); //繪製圓柱形的底 g.DrawArc(new Pen(Color.FromArgb(213, 204, 186), 3), new Rectangle(rect.X, rect.Y + intHeight, s.Width, intRecHeight), 170, 10); //繪製圓柱形上底出來的左邊 g.DrawArc(new Pen(Color.FromArgb(213, 204, 186), 3), new Rectangle(rect.X, rect.Y + intHeight, s.Width, intRecHeight), 0, 10); //繪製圓柱形上底出來的右邊 }
上面的繪製方法最重要的部分沒有說明,是關於圓柱的高和底的橢圓比的問題,這個比值相當重要,有了這個比值繪製出來的橢圓才美觀……
上文中從GDI+的基礎出發,匯總了GDI+編程過程中常用的幾種類,通過分類能夠使我們更加清晰的分清幾種類的用法,能達到靈活的使用幾種類來建立圖形。另外還有多實踐,在實戰中深刻的體會它們之間的用法,這樣才能做到遊刃有餘。