歡迎光臨 敏捷實(shí)驗(yàn)室 登錄 | 注冊(cè) | 幫助
Davidwu
http://www.
http://www./blogs/%e5%90%b4%e5%ba%86%e4%bc%9f/archive/2007/02/06/1853.aspx
This Blog
電子郵件
聯(lián)合
RSS 2.0
Atom 1.0
Search
Go
標(biāo)簽
雜談
導(dǎo)航
首頁(yè)
博客
論壇
相冊(cè)
下載
我的閱讀器
存檔
九月 2007 (7)
七月 2007 (1)
六月 2007 (1)
三月 2007 (8)
二月 2007 (10)
GDI+ SDK參考 - (翻譯) [3]
線條、曲線和圖形
GDI+的矢量圖部分用于繪制線條、繪制曲線,繪制和填充圖形。
矢量圖概覽
Microsoft Windows GDI+在一個(gè)坐標(biāo)系統(tǒng)中繪制線條、矩形和其他圖形。您可以選擇各種不同的坐標(biāo)系統(tǒng),但是默認(rèn)的坐標(biāo)系統(tǒng)規(guī)定其左上角位置為起點(diǎn),X軸指向右邊、Y軸之指向下邊。默認(rèn)坐標(biāo)系統(tǒng)的度量單位是象素(Pixel)。
電腦顯示器在一個(gè)矩形點(diǎn)陣上創(chuàng)建其顯示畫面,這些點(diǎn)稱為圖片要素或者象素。不同的顯示器其在屏幕上顯示的點(diǎn)數(shù)不盡相同,并且通常一個(gè)獨(dú)立顯示器其顯示的象素總數(shù)可以由用戶進(jìn)行調(diào)節(jié)。
在您采用GDI+繪制線條、矩形和曲線的時(shí)候,您需要提供一些關(guān)于繪制對(duì)象的關(guān)鍵性信息。例如,您可以通過(guò)2點(diǎn)確定一條線段,您可以通過(guò)一個(gè)點(diǎn)、高度和寬度確定一個(gè)矩形。GDI+與顯示器驅(qū)動(dòng)程序協(xié)同工作,來(lái)判斷哪個(gè)象素應(yīng)該開啟用于顯示線條、矩形和曲線。下面所示,顯示一條從點(diǎn)(4, 2)到點(diǎn)(12, 8)的線條的象素情況。
總的來(lái)說(shuō),某些基本的構(gòu)成塊已經(jīng)證明是最對(duì)建立二維圖形非常有用。這些基本構(gòu)成塊,GDI+均支持,包括:
o Lines (線條)
o Rectangles (矩形)
o Ellipses (橢圓)
o Arcs (弧形)
o Polygons (多邊形)
o Cardinal splines (基數(shù)樣條)
o Bézier splines (貝塞爾樣條)
GDI+中的Graphics類提供這些方法來(lái)繪制前面列表中的對(duì)象:DrawLine、DrawRectangle、DrawEllipse、DrawPolygon、DrawArc、DrawCurve (用于基數(shù)樣條)和DrawBezier。每個(gè)方法都已被重載;也就是說(shuō),每種方法都以不同參數(shù)列表的變體出現(xiàn)。例如,DrawLine方法的一個(gè)變體接受一個(gè)Pen對(duì)象的地址和四個(gè)整型值,而它的另一個(gè)變體則接受一個(gè)Pen對(duì)象地址和兩個(gè)Point對(duì)象引用。
繪制線條、矩形和貝塞爾樣條的方法都有其復(fù)數(shù)形式的伴隨方法,這些方法在一次調(diào)用中繪制多個(gè)項(xiàng)目:DrawLines、DrawRectangles和DrawBeziers。同樣地,DrawCurve方法也有一個(gè)伴隨方法DrawClosedCurve,該函數(shù)通過(guò)連接曲線的起點(diǎn)和終點(diǎn)創(chuàng)建一個(gè)閉合圖形。
所有的Graphics類的方法都得配合Pen對(duì)象使用。因此,為了繪制任何東西,您必須至少創(chuàng)建2個(gè)對(duì)象:一個(gè)Graphics 對(duì)象和一個(gè)Pen對(duì)象。Pen對(duì)象存儲(chǔ)諸如線條寬度、顏色等繪圖屬性。Pen對(duì)象的地址將作為一個(gè)參數(shù)傳遞給繪圖方法。例如,一個(gè)DrawRectangle方法的變體需要傳入一個(gè)Pen對(duì)象地址和4各整數(shù)值作為參數(shù),該方法繪制一個(gè)左上角為(20,10)、寬度為100、高度為50的矩形。
myGraphics.DrawRectangle(&myPen, 20, 10, 100, 50);鋼筆、線條和矩形
采用GDI+繪制線條需要一個(gè)Graphics對(duì)象和一個(gè)Pen對(duì)象。Graphics對(duì)象提供實(shí)際的繪圖方法,而Pen對(duì)象存儲(chǔ)線條屬性,例如顏色、寬度和樣式等。繪制線條只需要簡(jiǎn)單調(diào)用Graphics對(duì)象的DrawLine方法即可。Pen對(duì)象的地址作為參數(shù)之一傳遞給DrawLine方法。下面的例子是繪制一條從點(diǎn)(4, 2)到點(diǎn)(12, 6)的線段。
myGraphics.DrawLine(&myPen, 4, 2, 12, 6);DrawLin是一個(gè)在Graphics類中被重載的方法,因此您可以提供幾種不同的參數(shù)。例如,您可以構(gòu)造2個(gè)Point對(duì)象,然后將這2個(gè)Point對(duì)象的引用作為參數(shù)傳遞給DrawLine方法。
Point myStartPoint(4, 2);Point myEndPoint(12, 6);myGraphics.DrawLine(&myPen, myStartPoint, myEndPoint);您也可以在構(gòu)造Pen對(duì)象時(shí)給它的屬性賦值。例如,有個(gè)Pen的構(gòu)造函數(shù)允許您指定顏色和寬度。下面的例子是從點(diǎn)(0, 0)到點(diǎn)(60, 30)繪制一條寬度為2的藍(lán)色線段。
Pen myPen(Color(255, 0, 0, 255), 2);myGraphics.DrawLine(&myPen, 0, 0, 60, 30);Pen對(duì)象同樣有自己的屬性,例如虛線樣式,您可以用來(lái)指定線條特征。例如,下面的例子用于繪制一條從點(diǎn)(100, 50)到點(diǎn)(300, 80)的虛線。
myPen.SetDashStyle(DashStyleDash);myGraphics.DrawLine(&myPen, 100, 50, 300, 80);您可以使用Pen對(duì)象的多種方法來(lái)設(shè)置更多的線條屬性。SetStartCap和SetEndCap方法指定線條末端的表現(xiàn)形式;線帽可以為扁平、方塊、圓角、三角或者用戶定義形狀。SetLineJoin方法允許您設(shè)置線條間的聯(lián)接方式是斜接(有明顯邊角)、斜切、圓或者裁剪。下圖顯示的是具有不同的端點(diǎn)類型和連接方式的線條。
繪制矩形的方法和畫線的方法相似。繪制一個(gè)矩形,您需要一個(gè)Graphics對(duì)象和一個(gè)Pen對(duì)象。Graphics對(duì)象提供一個(gè)DrawRectangle方法,而Pen對(duì)象存儲(chǔ)輸入線條寬度和顏色等屬性。Pen對(duì)象的地址作為參數(shù)之一傳遞給DrawRectangle方法。下面的例子是繪制一個(gè)左上角為(100,50)、寬度為80、高度為40的矩形。
myGraphics.DrawRectangle(&myPen, 100, 50, 80, 40);DrawRectangle是一個(gè)在Graphics類中被重載的方法,因此也有幾種不同傳遞參數(shù)的方式。例如,您可以先構(gòu)造一個(gè)Rect對(duì)象然后將Rect對(duì)象的引用作為參數(shù)之一傳遞給DrawRectangle方法。
Rect myRect(100, 50, 80, 40);myGraphics.DrawRectangle(&myPen, myRect);Rect對(duì)象的某些方法可以控制和收集矩形的有關(guān)信息。例如,Inflate和Offset方法可以改變矩形的尺寸和位置。IntersectsWith方法告訴您一個(gè)矩形是否和另一個(gè)矩形交叉了,Contains方法則告訴您指定的點(diǎn)是否在一個(gè)矩形內(nèi)部。
橢圓和弧
一個(gè)橢圓由它的外接矩形來(lái)描述。下圖顯示了一個(gè)橢圓和它的外接矩形。
繪制一個(gè)橢圓,您需要一個(gè)Graphics對(duì)象和一個(gè)Pen對(duì)象。Graphics對(duì)象提供DrawEllipse方法,Pen對(duì)象存儲(chǔ)諸如線條寬度和顏色等信息。Pen對(duì)象的地址作為參數(shù)之一傳遞給DrawEllipse方法。傳遞給DrawEllipse方法其余的參數(shù)指定其外接矩形。下面的例子將繪制一個(gè)橢圓;其外接矩形寬度為160、高度為80,左上角位置為(100,50)。
myGraphics.DrawEllipse(&myPen, 100, 50, 160, 80);DrawEllipse是一個(gè)在Graphics類中被重載的方法,因此也有幾種不同傳遞參數(shù)的方式。例如,您可以先構(gòu)造一個(gè)Rect對(duì)象然后將Rect對(duì)象的引用作為參數(shù)之一傳遞給DrawEllipse方法。
Rect myRect(100, 50, 160, 80);myGraphics.DrawEllipse(&myPen, myRect);弧是橢圓的一部分。繪制弧形,您需要調(diào)用Graphics類的DrawArc方法。DrawArc方法的參數(shù)和DrawEllipse方法的參數(shù)一樣,除此之外還需要提供起始角和掃描角。下面的例子繪制一條弧形,其起始角為30度,掃描角為180度。
myGraphics.DrawArc(&myPen, 100, 50, 160, 80, 30, 180);下圖同時(shí)顯示了弧形、橢圓與外接矩形。
多邊形
多邊形是由3個(gè)或3個(gè)以上的直邊所組成的閉合圖形。例如,三角形就是3條邊所組成,矩形由4條邊組成,五角星由5條邊所組成。下圖顯示了幾種不同的多邊形。
繪制多邊形,您需要一個(gè)Graphics對(duì)象,一個(gè)Pen對(duì)象,以及一個(gè)Point(或者PointF)對(duì)象數(shù)組。Graphics對(duì)象提供DrawPolygon方法,Pen對(duì)象存儲(chǔ)多邊形的線條寬度和顏色等信息,Point對(duì)象數(shù)組則存儲(chǔ)相連直線的點(diǎn)集。Pen對(duì)象的地址和Point對(duì)象數(shù)組作為參數(shù)傳遞給DrawPolygon方法。下面的例子將繪制一個(gè)3條邊的多邊形。注意在myPointArray中只有3個(gè)點(diǎn):(0, 0)、 (50, 30)和 (30, 60)。DrawPolygon方法自動(dòng)繪制從(30, 60)返回點(diǎn)(0, 0)的線條使該多邊形閉合。
Point myPointArray[] = {Point(0, 0), Point(50, 30), Point(30, 60)};myGraphics.DrawPolygon(&myPen, myPointArray, 3);下圖顯示了該多邊形。
基數(shù)樣條
基數(shù)樣條是一組單個(gè)曲線按照一定的順序連接而成的一條較大曲線。樣條由一個(gè)點(diǎn)數(shù)組和一個(gè)張力參數(shù)描述。由于基數(shù)樣條平滑地穿過(guò)數(shù)組中的每一個(gè)點(diǎn);在曲線的密度上不會(huì)不出現(xiàn)銳角和突變。下圖顯示一組點(diǎn)和穿過(guò)它們每個(gè)點(diǎn)的基數(shù)樣條。
物理樣條是一小片木頭或者其他柔性材質(zhì)做成的。在數(shù)學(xué)樣條誕生之前,設(shè)計(jì)人員采用物理樣條來(lái)繪制曲線。它們將樣條置于紙上然后定位一系列錨點(diǎn),然后用鉛筆沿著樣條繪制曲線。給出的一系列點(diǎn)可能產(chǎn)生不同的曲線,這取決于物理樣條的性質(zhì)。例如,與一個(gè)極其易彎曲的樣條相比,有較高的抗彎能力的一個(gè)樣條將生產(chǎn)一條不同的曲線。
數(shù)學(xué)樣條的公式基于柔性桿的特性, 因此數(shù)學(xué)樣條生產(chǎn)的曲線類似于曾經(jīng)由物理樣條生產(chǎn)的曲線。正如物理樣條通過(guò)給定的一組點(diǎn)時(shí)在不同的張力下的將生成一條不同的曲線一樣, 數(shù)學(xué)樣條在張力參數(shù)不同的時(shí)候也將生成不同的曲線。下圖顯示了通過(guò)相同一組點(diǎn)集的4條基數(shù)樣條。每條樣條都標(biāo)注了它的張力參數(shù)。注意張力系數(shù)為0的情況下相當(dāng)于無(wú)限的物理張力,迫使曲線走點(diǎn)之間的最短路徑(直線)。張力系數(shù)為1表示沒有物理張力,此時(shí)樣條采用最小彎程。如果張力系數(shù)大于1,此時(shí)的樣條看起來(lái)就像被壓扁的彈簧,被迫經(jīng)過(guò)更長(zhǎng)的路徑。
需要注意的是,以上4條樣條在頂點(diǎn)處都擁有相同的切線。切線表示從一個(gè)起始點(diǎn)沿曲線指向下一個(gè)點(diǎn)間的直線。同樣的,終點(diǎn)共享的切線表示從終點(diǎn)開始的沿曲線曲線指向前一個(gè)點(diǎn)。
繪制一條基數(shù)樣條,您需要一個(gè)Graphics對(duì)象,一個(gè)Pen對(duì)象和一個(gè)Point對(duì)象數(shù)組。Graphics對(duì)象提供DrawCurve方法用于繪制基數(shù)樣條,Pen對(duì)象存儲(chǔ)諸如線條寬度和顏色等信息,Point對(duì)象數(shù)組存儲(chǔ)曲線經(jīng)過(guò)的點(diǎn)集。下面的例子將繪制一條基數(shù)樣條,它穿過(guò)myPointArray點(diǎn)集。第三個(gè)參數(shù)是張力參數(shù)。
myGraphics.DrawCurve(&myPen, myPointArray, 3, 1.5f);貝塞爾樣條
貝塞爾樣條是由4個(gè)點(diǎn)所確定的曲線:2個(gè)端點(diǎn)(p1和p2)和2個(gè)控制點(diǎn)(c1和c2)。曲線始于p1終于p2。曲線并不經(jīng)過(guò)控制點(diǎn),但是控制點(diǎn)扮演了磁鐵的角色,將曲線往某個(gè)方向拉從而影響了曲線的走向。下圖顯示了貝塞爾樣條和它的頂點(diǎn)以及控制點(diǎn)。
注意,曲線從p1開始向控制點(diǎn)c1移動(dòng)。P1位置的切線是從p1到c1。同時(shí)請(qǐng)注意,終點(diǎn)p2處的切線是從c2到p2的。
繪制貝塞爾樣條,您需要一個(gè)Graphics對(duì)象和一個(gè)Pen對(duì)象。Graphics對(duì)象提供DrawBezier方法,而Pen對(duì)象存儲(chǔ)諸如線條寬度和顏色等信息。Pen對(duì)象的地址作為參數(shù)之一傳遞給DrawBezier方法。DrawBezier方法余下的參數(shù)傳入頂點(diǎn)和控制點(diǎn)。下面的例子將繪制一條貝塞爾樣條,它的起點(diǎn)為(0,0),控制點(diǎn)為(40,20)和(80,150),終點(diǎn)為(100,10)。
myGraphics.DrawBezier(&myPen, 0, 0, 40, 20, 80, 150, 100, 10);下圖顯示該曲線、控制點(diǎn)和兩條切線。
貝塞爾樣條最初由Pierre Bézier在汽車工業(yè)設(shè)計(jì)中發(fā)明。它被證明對(duì)于多種類型的計(jì)算機(jī)輔助設(shè)計(jì)非常有用,同時(shí)還用于定義字體輪廓。貝塞爾樣條可以產(chǎn)生多種形狀,下圖羅列了其中一些:
路徑
路徑由線條、矩形以及簡(jiǎn)單曲線等組合而成?;仡櫴噶繄D形概念部分,以下基本構(gòu)成塊被證明對(duì)于繪制圖象非常有用。
l Lines (線條)
l Rectangles (矩形)
l Ellipses (橢圓)
l Arcs (弧線)
l Polygons (多邊形)
l Cardinal splines (基數(shù)樣條)
l Bézier splines (貝塞爾樣條)
在GDI+中,GraphicsPath對(duì)象允許您將這些基本組成部分組合成一個(gè)單獨(dú)的單位。整個(gè)一組線條、矩形、多邊形和曲線可以通過(guò)Graphcis類的DrawPath方法一次性繪制。下圖顯示的是一條有線條、弧線、貝塞爾樣條以及基數(shù)樣條所組成的路徑。
GraphicsPath類提供如下方法用于創(chuàng)建一系列對(duì)象:AddLine、AddRectangle、AddEllipse、AddArc、AddPolygon、AddCurve (用于基數(shù)樣條)以及AddBezier。它們中的每個(gè)方法都已被重載;也就是說(shuō),您可以傳入不同的參數(shù)列表。例如,AddLine方法的變體之一需要傳入4個(gè)整形值,而另外一個(gè)變體則需要傳入2個(gè)Point對(duì)象。
添加線條、矩形和貝塞爾樣條的方法都有其復(fù)數(shù)形式的伴隨方法,這些方法在一次調(diào)用中添加多個(gè)項(xiàng)目:AddLines、AddRectangles和AddBeziers。同樣地,AddCurve方法也有一個(gè)伴隨方法AddClosedCurve,該函數(shù)通過(guò)連接曲線的起點(diǎn)和終點(diǎn)添加一個(gè)閉合曲線。
繪制一條路徑,您需要一個(gè)Graphcis對(duì)象,一個(gè)Pen對(duì)象和一個(gè)GraphicsPath對(duì)象。Graphics對(duì)象提供方法。Pen對(duì)象存儲(chǔ)諸如線條寬度和顏色等信息。GraphicsPath對(duì)象存儲(chǔ)線條、矩形和曲線序列用以構(gòu)成一條路徑。Pend對(duì)象和GracphisPath對(duì)象的地址作為參數(shù)傳給DrawPath方法。下面的例子將繪制一條路徑,它由一根線條、一個(gè)橢圓和一條貝塞爾樣條組成。
myGraphicsPath.AddLine(0, 0, 30, 20);myGraphicsPath.AddEllipse(20, 20, 20, 40);myGraphicsPath.AddBezier(30, 60, 70, 60, 50, 30, 100, 10);myGraphics.DrawPath(&myPen, &myGraphicsPath);下圖所示為該路徑:
除了添加線條、矩形和曲線到路徑外,您還可以添加路徑到路徑。這允許您將已有路徑組合為更大更復(fù)雜的路徑。下面的代碼將graphicsPath1和graphicsPath2加入到myGraphicsPath中。AddPath方法的第二個(gè)參數(shù)用于指定新增路徑是否與已有路徑相連。
myGraphicsPath.AddPath(&graphicsPath1, FALSE);myGraphicsPath.AddPath(&graphicsPath2, TRUE);另外還有2個(gè)項(xiàng)目您可以加入路徑中:字符串和餅圖。餅圖是橢圓的一部分。下面的例子將創(chuàng)建一個(gè)由弧線、基數(shù)樣條、字符串和餅圖組成的路徑。
myGraphicsPath.AddArc(0, 0, 30, 20, -90, 180);myGraphicsPath.AddCurve(myPointArray, 3);myGraphicsPath.AddString(L"a string in a path", 18, &myFontFamily, 0, 24, myPointF, &myStringFormat);myGraphicsPath.AddPie(230, 10, 40, 40, 40, 110);myGraphics.DrawPath(&myPen, &myGraphicsPath);下圖所示為這個(gè)路徑。注意這個(gè)路徑并沒有連接起來(lái);弧線、基數(shù)樣條、字符串和餅圖都是相離的。
畫刷和填充圖形
一個(gè)閉合圖形比如矩形和橢圓包含一個(gè)邊框和內(nèi)部區(qū)域。邊框是由Pen對(duì)象繪制,而內(nèi)部區(qū)域由Brush對(duì)象進(jìn)行填充。Microsoft Windows GDI+提供幾種畫刷類用于填充閉合圖形的內(nèi)部區(qū)域:SolidBrush、HatchBrush、TextureBrush、LinearGradientBrush和PathGradientBrush。所有這些類都繼承于Brush類。下圖顯示了一個(gè)由純色畫刷填充的矩形和一個(gè)由陰影畫刷填充的橢圓。
· 純色畫刷
填充一個(gè)閉合圖形,您需要一個(gè)Graphics對(duì)象和一個(gè)Brush對(duì)象。Graphics對(duì)象提供方法,比如FillRectangle 和 FillEllipse,而Brush對(duì)象存儲(chǔ)諸如顏色和圖案等填充屬性。Brush對(duì)象的地址作為參數(shù)之一傳遞給填充方法。下面的例子將用實(shí)行紅色填充一個(gè)橢圓。
SolidBrush mySolidBrush(Color(255, 255, 0, 0));myGraphics.FillEllipse(&mySolidBrush, 0, 0, 60, 40);注意上例中,畫刷采用的是SolidBrush類型,它繼承于Brush。
· 陰影畫刷
當(dāng)您需要填充一個(gè)陰影畫刷時(shí),您需要指定其前景色、背景色和陰影樣式。前景色就是陰影的顏色。
HatchBrush myHatchBrush( HatchStyleVertical, Color(255, 0, 0, 255), Color(255, 0, 255, 0));GDI+提供了超過(guò)50種陰影樣式,這些樣式在HatchStyle中定義。下面顯示的3種陰影分別是水平、正向?qū)蔷€和十字交叉陰影。
· 紋理畫刷
通過(guò)紋理畫刷,您可以使用存儲(chǔ)于位圖中的紋理來(lái)填充圖形。例如,假設(shè)下面的圖形存儲(chǔ)在磁盤文件MyTexture.bmp中。
下面的例子將創(chuàng)建一個(gè)由MyTexture.bmp中存儲(chǔ)的圖片反復(fù)填充得到的橢圓。
Image myImage(L"MyTexture.bmp");TextureBrush myTextureBrush(&myImage);myGraphics.FillEllipse(&myTextureBrush, 0, 0, 100, 50);下圖所示為填充結(jié)果:
· 漸變畫刷
您可以采用漸變畫刷填充一個(gè)圖形,使得該圖形可以從一個(gè)部分到另一部分由一種顏色漸變?yōu)槠渌伾@?,一個(gè)水平漸變畫刷將使得從左至右顏色漸變。下面的例子將采用水平漸變畫刷填充一個(gè)橢圓,從左至右顏色由藍(lán)色逐漸變?yōu)榫G色。
LinearGradientBrush myLinearGradientBrush( myRect, Color(255, 0, 0, 255), Color(255, 0, 255, 0), LinearGradientModeHorizontal);myGraphics.FillEllipse(&myLinearGradientBrush, myRect); 下圖所示為填充后的橢圓:
路徑漸變畫刷允許您設(shè)置從中心向邊界漸變得畫刷。
路徑漸變畫刷非常靈活。下圖中用于填充三角形的漸變畫刷中心為紅色,向每個(gè)頂點(diǎn)漸變?yōu)?個(gè)不同的顏色。
開放與閉合曲線
下面顯示了兩個(gè)曲線:一個(gè)開放,一個(gè)閉合。
閉合曲線因?yàn)橛袃?nèi)部區(qū)域因而可以被畫刷填充。GDI+中的Graphcis類提供如下方法用于填充閉合圖形和曲線:FillRectangle、FillEllipse、FillPie、FillPolygon、FillClosedCurve、FillPath和FillRegion。任何時(shí)候在您調(diào)用這些方法的其中之一時(shí),您必須將一個(gè)指定類型的畫刷(SolidBrush、HatchBrush、TextureBrush、LinearGradientBrush或者PathGradientBrush)地址作為參數(shù)之一傳入。
FillPie方法伴隨著DrawArc方法。正如DrawArc方法繪制橢圓邊界的一部分,F(xiàn)illPie方法填充橢圓內(nèi)部區(qū)域的一部分。下面的例子將繪制一段弧線,然后填充該橢圓內(nèi)部的相應(yīng)區(qū)域。
myGraphics.FillPie(&mySolidBrush, 0, 0, 140, 70, 0, 120);myGraphics.DrawArc(&myPen, 0, 0, 140, 70, 0, 120);下圖所示為這條弧線和填充的餅圖。
FillClosedCurve方法伴隨DrawClosedCurve方法。這兩個(gè)方法都將終點(diǎn)自動(dòng)連接起點(diǎn)從而使曲線閉合。下面的例子將繪制一條穿過(guò)(0, 0),(60, 20)和(40, 50)的曲線。然后該曲線通過(guò)連接(40, 50)和起點(diǎn)(0, 0)自動(dòng)閉合,然后采用實(shí)行畫刷對(duì)該區(qū)域進(jìn)行填充。
Point myPointArray[] = {Point(10, 10), Point(60, 20),Point(40, 50)};myGraphics.DrawClosedCurve(&myPen, myPointArray, 3);myGraphics.FillClosedCurve(&mySolidBrush, myPointArray, 3, FillModeAlternate)一條路徑可以包含多個(gè)圖形(子路徑)。FillPath方法填充每個(gè)圖形的內(nèi)部區(qū)域。如果一個(gè)圖形不是閉合的,那么FillPath方法將假設(shè)它是閉合的然后進(jìn)行填充。下面的例子將填充一個(gè)由弧線、基數(shù)樣條、字符串和餅圖組成的路徑。
myGraphics.FillPath(&mySolidBrush, &myGraphicsPath);myGraphics.DrawPath(&myPen, &myGraphicsPath);下圖為該路徑采用純色畫刷填充前后的樣子。注意,采用DrawPath方法時(shí),字符串描出輪廓,但是沒有填充。而FillPath方法將字符串各字符內(nèi)部進(jìn)行了著色。
區(qū)域
區(qū)域指的是顯示表面的一部分。區(qū)域可以簡(jiǎn)單(單個(gè)矩形)也可以復(fù)雜(由一個(gè)由多邊形和閉合曲線組成)。下圖顯示了2個(gè)區(qū)域:一個(gè)由矩形構(gòu)成,另一個(gè)由路徑構(gòu)成。
通常區(qū)域用來(lái)裁剪 (Clipping) 和進(jìn)行點(diǎn)擊測(cè)試 (Hit Testing)。裁剪包括限制對(duì)顯示區(qū)域的某個(gè)特定區(qū)域進(jìn)行繪制,通常該區(qū)域?yàn)楸仨氝M(jìn)行更新的部分。點(diǎn)擊測(cè)試包括檢查并判斷當(dāng)按下鼠標(biāo)按鈕時(shí),光標(biāo)是否位于屏幕的某個(gè)特定區(qū)域中。
您可以從矩形或路徑建立區(qū)域。您也可以通過(guò)組合現(xiàn)有的區(qū)域來(lái)建立復(fù)雜的區(qū)域。Region 類提供下列用來(lái)組合區(qū)域的方法:Intersect、Union、Xor、Exclude 和 Complement。
兩個(gè)區(qū)域的交集是指隸屬于這兩個(gè)區(qū)域的所有點(diǎn)的組合。聯(lián)集是指屬于其中一個(gè)或兩個(gè)區(qū)域的所有點(diǎn)的組合。區(qū)域的補(bǔ)碼 (Complement) 是指所有區(qū)域以外的點(diǎn)。下圖將顯示前圖所說(shuō)明的兩個(gè)區(qū)域的交集和聯(lián)集。
套用到區(qū)域組的 Xor 方法會(huì)產(chǎn)生一個(gè)區(qū)域,其中含有隸屬于其中一個(gè)區(qū)域 (而非兩個(gè)) 的所有點(diǎn)。套用到區(qū)域組合的 Exclude 方法會(huì)產(chǎn)生一個(gè)區(qū)域,其中含有第一個(gè)區(qū)域中但位于第二個(gè)區(qū)域以外的所有點(diǎn)。下圖將顯示因套用 Xor 和 Exclude 方法到本主題一開始所說(shuō)明的兩個(gè)區(qū)域時(shí),所產(chǎn)生的區(qū)域。
若要繪制區(qū)域,您需要Graphics對(duì)象、Brush對(duì)象和Region對(duì)象。Graphics對(duì)象提供FillRegion方法,而Brush對(duì)象則是儲(chǔ)存填充的特性,例如色彩或圖樣。下列范例將純色填入?yún)^(qū)域中:
myGraphics.FillRegion(&mySolidBrush, &myRegion);裁剪
裁剪是指限制對(duì)特定區(qū)域進(jìn)行繪制。下圖將顯示 "Hello" 字符串被裁剪為心形的區(qū)域。
區(qū)域可從路徑建立,而路徑中可包含字符串的字型外框,因此您可以使用外框文字來(lái)進(jìn)行裁剪。下圖將顯示裁減為文字字符串內(nèi)景的一組同心橢圓。
若要使用裁剪來(lái)進(jìn)行繪制,請(qǐng)建立Graphics對(duì)象,調(diào)用其SetClip方法,然后調(diào)用相同 Graphics 對(duì)象的繪圖方法。下例將繪制一條被矩形區(qū)域裁剪的直線:
Region myRegion(Rect(20, 30, 100, 50));myGraphics.DrawRectangle(&myPen, 20, 30, 100, 50); myGraphics.SetClip(&myRegion, CombineModeReplace);myGraphics.DrawLine(&myPen, 0, 0, 200, 200);下圖顯示了一個(gè)矩形區(qū)域裁剪的直線。
路徑平直化
對(duì)象存儲(chǔ)一系列的線條和貝塞爾樣條。您可以加入多種類型的曲線(橢圓、弧線、基數(shù)樣條)到路徑中,但是其中每條曲線在存儲(chǔ)為路徑之前都將轉(zhuǎn)化為貝塞爾樣條。路徑平直化處理表示將路徑中的每條貝塞爾樣條轉(zhuǎn)化為一系列的直線。
若要平直化一條路徑,需要調(diào)用GraphicsPath對(duì)象的Flatten方法。Flatten方法有一個(gè)平直度的參數(shù),表示平直化后的路徑與原始路徑的最大距離。下圖顯示了一條路徑平直化處理前后的情形:
線條和曲線的抗鋸齒功能
使用 GDI+ 繪制線條時(shí),您必須提供線條的起始點(diǎn)和結(jié)束點(diǎn),但不必提供該線條的個(gè)別像素相關(guān)信息。GDI+ 是與顯示驅(qū)動(dòng)程序軟件搭配使用,來(lái)決定必須開啟哪些像素,才可以在特定顯示裝置上顯示該線條。
舉這條從點(diǎn) (4, 2) 到點(diǎn) (16, 10) 的直色紅線作為范例說(shuō)明。假設(shè)坐標(biāo)系統(tǒng)的原點(diǎn)在左上角,而度量單位為像素。同時(shí)我們也假設(shè) X 軸指向右方,而 Y 軸則向下延伸。下圖將顯示在多重色彩背景上繪制的紅色線條的放大畫面。
用來(lái)呈現(xiàn)線條的紅色像素是不透明的。這條直線的像素全部都是不透明的。此類線條繪制方式所產(chǎn)生的線條會(huì)出現(xiàn)鋸齒形的外觀,看起來(lái)有點(diǎn)像階梯。這種將線條繪制成階梯狀的技術(shù)稱為鋸齒 (Aliasing);這種階梯為理論線條的別名。
另一種更為復(fù)雜的繪制線條技術(shù)是同時(shí)使用透明的像素和不透明的像素。像素將設(shè)為純紅色或紅色與背景色彩的混色,但是這需要視像素與線條接近的程度。此類繪制方式稱為反鋸齒 (Antialiasing),可產(chǎn)生肉眼感覺更為平滑的線條。下圖將顯示某些像素將與背景混色以產(chǎn)生反鋸齒線條。
反鋸齒 (亦稱為平滑化) 也可套用至曲線。下圖將顯示平滑橢圓形的放大畫面。
下圖將顯示同一個(gè)橢圓形的實(shí)際大小,一個(gè)未使用反鋸齒功能,另一個(gè)則使用反鋸齒功能。
若要繪制使用平滑的線條和曲線,請(qǐng)先建立一個(gè) Graphics 類對(duì)象,并傳遞SmoothingModeAntiAlias給它的SetSmoothingMode方法。然后,調(diào)用Graphics 類的相同的繪圖方法。
myGraphics.SetSmoothingMode(SmoothingModeAntiAlias);myGraphics.DrawLine(&myPen, 0, 0, 12, 8);SmoothingModeAntiAlias是SmoothingMode枚舉中的元素之一。
已發(fā)表 2007年2月6日 21:40 作者
評(píng)論
尚無(wú)任何評(píng)論
禁止匿名發(fā)表評(píng)論
Copyright Agilelabs Team, 2005. All rights reserved.
瓊ICP備05005773號(hào)
|