GDI+ SDK參考 - (翻譯) [3]
GDI+的矢量圖部分用于繪制線條、繪制曲線,繪制和填充圖形。
Microsoft Windows GDI+在一個坐標系統(tǒng)中繪制線條、矩形和其他圖形。您可以選擇各種不同的坐標系統(tǒng),但是默認的坐標系統(tǒng)規(guī)定其左上角位置為起點,X軸指向右邊、Y軸之指向下邊。默認坐標系統(tǒng)的度量單位是象素(Pixel)。

電腦顯示器在一個矩形點陣上創(chuàng)建其顯示畫面,這些點稱為圖片要素或者象素。不同的顯示器其在屏幕上顯示的點數(shù)不盡相同,并且通常一個獨立顯示器其顯示的象素總數(shù)可以由用戶進行調(diào)節(jié)。

在您采用GDI+繪制線條、矩形和曲線的時候,您需要提供一些關(guān)于繪制對象的關(guān)鍵性信息。例如,您可以通過2點確定一條線段,您可以通過一個點、高度和寬度確定一個矩形。GDI+與顯示器驅(qū)動程序協(xié)同工作,來判斷哪個象素應(yīng)該開啟用于顯示線條、矩形和曲線。下面所示,顯示一條從點(4, 2)到點(12, 8)的線條的象素情況。

總的來說,某些基本的構(gòu)成塊已經(jīng)證明是最對建立二維圖形非常有用。這些基本構(gòu)成塊,GDI+均支持,包括:
o Lines (線條)
o Rectangles (矩形)
o Ellipses (橢圓)
o Arcs (弧形)
o Polygons (多邊形)
o Cardinal splines (基數(shù)樣條)
o Bézier splines (貝塞爾樣條)
GDI+中的Graphics類提供這些方法來繪制前面列表中的對象:DrawLine、DrawRectangle、DrawEllipse、DrawPolygon、DrawArc、DrawCurve (用于基數(shù)樣條)和DrawBezier。每個方法都已被重載;也就是說,每種方法都以不同參數(shù)列表的變體出現(xiàn)。例如,DrawLine方法的一個變體接受一個Pen對象的地址和四個整型值,而它的另一個變體則接受一個Pen對象地址和兩個Point對象引用。
繪制線條、矩形和貝塞爾樣條的方法都有其復(fù)數(shù)形式的伴隨方法,這些方法在一次調(diào)用中繪制多個項目:DrawLines、DrawRectangles和DrawBeziers。同樣地,DrawCurve方法也有一個伴隨方法DrawClosedCurve,該函數(shù)通過連接曲線的起點和終點創(chuàng)建一個閉合圖形。
所有的Graphics類的方法都得配合Pen對象使用。因此,為了繪制任何東西,您必須至少創(chuàng)建2個對象:一個Graphics 對象和一個Pen對象。Pen對象存儲諸如線條寬度、顏色等繪圖屬性。Pen對象的地址將作為一個參數(shù)傳遞給繪圖方法。例如,一個DrawRectangle方法的變體需要傳入一個Pen對象地址和4各整數(shù)值作為參數(shù),該方法繪制一個左上角為(20,10)、寬度為100、高度為50的矩形。
myGraphics.DrawRectangle(&myPen, 20, 10, 100, 50);
采用GDI+繪制線條需要一個Graphics對象和一個Pen對象。Graphics對象提供實際的繪圖方法,而Pen對象存儲線條屬性,例如顏色、寬度和樣式等。繪制線條只需要簡單調(diào)用Graphics對象的DrawLine方法即可。Pen對象的地址作為參數(shù)之一傳遞給DrawLine方法。下面的例子是繪制一條從點(4, 2)到點(12, 6)的線段。
myGraphics.DrawLine(&myPen, 4, 2, 12, 6);
DrawLin是一個在Graphics類中被重載的方法,因此您可以提供幾種不同的參數(shù)。例如,您可以構(gòu)造2個Point對象,然后將這2個Point對象的引用作為參數(shù)傳遞給DrawLine方法。
Point myStartPoint(4, 2);
Point myEndPoint(12, 6);
myGraphics.DrawLine(&myPen, myStartPoint, myEndPoint);
您也可以在構(gòu)造Pen對象時給它的屬性賦值。例如,有個Pen的構(gòu)造函數(shù)允許您指定顏色和寬度。下面的例子是從點(0, 0)到點(60, 30)繪制一條寬度為2的藍色線段。
Pen myPen(Color(255, 0, 0, 255), 2);
myGraphics.DrawLine(&myPen, 0, 0, 60, 30);
Pen對象同樣有自己的屬性,例如虛線樣式,您可以用來指定線條特征。例如,下面的例子用于繪制一條從點(100, 50)到點(300, 80)的虛線。
myPen.SetDashStyle(DashStyleDash);
myGraphics.DrawLine(&myPen, 100, 50, 300, 80);
您可以使用Pen對象的多種方法來設(shè)置更多的線條屬性。SetStartCap和SetEndCap方法指定線條末端的表現(xiàn)形式;線帽可以為扁平、方塊、圓角、三角或者用戶定義形狀。SetLineJoin方法允許您設(shè)置線條間的聯(lián)接方式是斜接(有明顯邊角)、斜切、圓或者裁剪。下圖顯示的是具有不同的端點類型和連接方式的線條。

繪制矩形的方法和畫線的方法相似。繪制一個矩形,您需要一個Graphics對象和一個Pen對象。Graphics對象提供一個DrawRectangle方法,而Pen對象存儲輸入線條寬度和顏色等屬性。Pen對象的地址作為參數(shù)之一傳遞給DrawRectangle方法。下面的例子是繪制一個左上角為(100,50)、寬度為80、高度為40的矩形。
myGraphics.DrawRectangle(&myPen, 100, 50, 80, 40);
DrawRectangle是一個在Graphics類中被重載的方法,因此也有幾種不同傳遞參數(shù)的方式。例如,您可以先構(gòu)造一個Rect對象然后將Rect對象的引用作為參數(shù)之一傳遞給DrawRectangle方法。
Rect myRect(100, 50, 80, 40);
myGraphics.DrawRectangle(&myPen, myRect);
Rect對象的某些方法可以控制和收集矩形的有關(guān)信息。例如,Inflate和Offset方法可以改變矩形的尺寸和位置。IntersectsWith方法告訴您一個矩形是否和另一個矩形交叉了,Contains方法則告訴您指定的點是否在一個矩形內(nèi)部。
一個橢圓由它的外接矩形來描述。下圖顯示了一個橢圓和它的外接矩形。

繪制一個橢圓,您需要一個Graphics對象和一個Pen對象。Graphics對象提供DrawEllipse方法,Pen對象存儲諸如線條寬度和顏色等信息。Pen對象的地址作為參數(shù)之一傳遞給DrawEllipse方法。傳遞給DrawEllipse方法其余的參數(shù)指定其外接矩形。下面的例子將繪制一個橢圓;其外接矩形寬度為160、高度為80,左上角位置為(100,50)。
myGraphics.DrawEllipse(&myPen, 100, 50, 160, 80);
DrawEllipse是一個在Graphics類中被重載的方法,因此也有幾種不同傳遞參數(shù)的方式。例如,您可以先構(gòu)造一個Rect對象然后將Rect對象的引用作為參數(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);
下圖同時顯示了弧形、橢圓與外接矩形。

多邊形是由3個或3個以上的直邊所組成的閉合圖形。例如,三角形就是3條邊所組成,矩形由4條邊組成,五角星由5條邊所組成。下圖顯示了幾種不同的多邊形。

繪制多邊形,您需要一個Graphics對象,一個Pen對象,以及一個Point(或者PointF)對象數(shù)組。Graphics對象提供DrawPolygon方法,Pen對象存儲多邊形的線條寬度和顏色等信息,Point對象數(shù)組則存儲相連直線的點集。Pen對象的地址和Point對象數(shù)組作為參數(shù)傳遞給DrawPolygon方法。下面的例子將繪制一個3條邊的多邊形。注意在myPointArray中只有3個點:(0, 0)、 (50, 30)和 (30, 60)。DrawPolygon方法自動繪制從(30, 60)返回點(0, 0)的線條使該多邊形閉合。
Point myPointArray[] =
{Point(0, 0), Point(50, 30), Point(30, 60)};
myGraphics.DrawPolygon(&myPen, myPointArray, 3);
下圖顯示了該多邊形。

基數(shù)樣條是一組單個曲線按照一定的順序連接而成的一條較大曲線。樣條由一個點數(shù)組和一個張力參數(shù)描述。由于基數(shù)樣條平滑地穿過數(shù)組中的每一個點;在曲線的密度上不會不出現(xiàn)銳角和突變。下圖顯示一組點和穿過它們每個點的基數(shù)樣條。

物理樣條是一小片木頭或者其他柔性材質(zhì)做成的。在數(shù)學(xué)樣條誕生之前,設(shè)計人員采用物理樣條來繪制曲線。它們將樣條置于紙上然后定位一系列錨點,然后用鉛筆沿著樣條繪制曲線。給出的一系列點可能產(chǎn)生不同的曲線,這取決于物理樣條的性質(zhì)。例如,與一個極其易彎曲的樣條相比,有較高的抗彎能力的一個樣條將生產(chǎn)一條不同的曲線。
數(shù)學(xué)樣條的公式基于柔性桿的特性, 因此數(shù)學(xué)樣條生產(chǎn)的曲線類似于曾經(jīng)由物理樣條生產(chǎn)的曲線。正如物理樣條通過給定的一組點時在不同的張力下的將生成一條不同的曲線一樣, 數(shù)學(xué)樣條在張力參數(shù)不同的時候也將生成不同的曲線。下圖顯示了通過相同一組點集的4條基數(shù)樣條。每條樣條都標注了它的張力參數(shù)。注意張力系數(shù)為0的情況下相當于無限的物理張力,迫使曲線走點之間的最短路徑(直線)。張力系數(shù)為1表示沒有物理張力,此時樣條采用最小彎程。如果張力系數(shù)大于1,此時的樣條看起來就像被壓扁的彈簧,被迫經(jīng)過更長的路徑。

需要注意的是,以上4條樣條在頂點處都擁有相同的切線。切線表示從一個起始點沿曲線指向下一個點間的直線。同樣的,終點共享的切線表示從終點開始的沿曲線曲線指向前一個點。
繪制一條基數(shù)樣條,您需要一個Graphics對象,一個Pen對象和一個Point對象數(shù)組。Graphics對象提供DrawCurve方法用于繪制基數(shù)樣條,Pen對象存儲諸如線條寬度和顏色等信息,Point對象數(shù)組存儲曲線經(jīng)過的點集。下面的例子將繪制一條基數(shù)樣條,它穿過myPointArray點集。第三個參數(shù)是張力參數(shù)。
myGraphics.DrawCurve(&myPen, myPointArray, 3, 1.5f);
貝塞爾樣條是由4個點所確定的曲線:2個端點(p1和p2)和2個控制點(c1和c2)。曲線始于p1終于p2。曲線并不經(jīng)過控制點,但是控制點扮演了磁鐵的角色,將曲線往某個方向拉從而影響了曲線的走向。下圖顯示了貝塞爾樣條和它的頂點以及控制點。

注意,曲線從p1開始向控制點c1移動。P1位置的切線是從p1到c1。同時請注意,終點p2處的切線是從c2到p2的。
繪制貝塞爾樣條,您需要一個Graphics對象和一個Pen對象。Graphics對象提供DrawBezier方法,而Pen對象存儲諸如線條寬度和顏色等信息。Pen對象的地址作為參數(shù)之一傳遞給DrawBezier方法。DrawBezier方法余下的參數(shù)傳入頂點和控制點。下面的例子將繪制一條貝塞爾樣條,它的起點為(0,0),控制點為(40,20)和(80,150),終點為(100,10)。
myGraphics.DrawBezier(&myPen, 0, 0, 40, 20, 80, 150, 100, 10);
下圖顯示該曲線、控制點和兩條切線。

貝塞爾樣條最初由Pierre Bézier在汽車工業(yè)設(shè)計中發(fā)明。它被證明對于多種類型的計算機輔助設(shè)計非常有用,同時還用于定義字體輪廓。貝塞爾樣條可以產(chǎn)生多種形狀,下圖羅列了其中一些:

路徑由線條、矩形以及簡單曲線等組合而成。回顧矢量圖形概念部分,以下基本構(gòu)成塊被證明對于繪制圖象非常有用。
l Lines (線條)
l Rectangles (矩形)
l Ellipses (橢圓)
l Arcs (弧線)
l Polygons (多邊形)
l Cardinal splines (基數(shù)樣條)
l Bézier splines (貝塞爾樣條)
在GDI+中,GraphicsPath對象允許您將這些基本組成部分組合成一個單獨的單位。整個一組線條、矩形、多邊形和曲線可以通過Graphcis類的DrawPath方法一次性繪制。下圖顯示的是一條有線條、弧線、貝塞爾樣條以及基數(shù)樣條所組成的路徑。

GraphicsPath類提供如下方法用于創(chuàng)建一系列對象:AddLine、AddRectangle、AddEllipse、AddArc、AddPolygon、AddCurve (用于基數(shù)樣條)以及AddBezier。它們中的每個方法都已被重載;也就是說,您可以傳入不同的參數(shù)列表。例如,AddLine方法的變體之一需要傳入4個整形值,而另外一個變體則需要傳入2個Point對象。
添加線條、矩形和貝塞爾樣條的方法都有其復(fù)數(shù)形式的伴隨方法,這些方法在一次調(diào)用中添加多個項目:AddLines、AddRectangles和AddBeziers。同樣地,AddCurve方法也有一個伴隨方法AddClosedCurve,該函數(shù)通過連接曲線的起點和終點添加一個閉合曲線。
繪制一條路徑,您需要一個Graphcis對象,一個Pen對象和一個GraphicsPath對象。Graphics對象提供方法。Pen對象存儲諸如線條寬度和顏色等信息。GraphicsPath對象存儲線條、矩形和曲線序列用以構(gòu)成一條路徑。Pend對象和GracphisPath對象的地址作為參數(shù)傳給DrawPath方法。下面的例子將繪制一條路徑,它由一根線條、一個橢圓和一條貝塞爾樣條組成。
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方法的第二個參數(shù)用于指定新增路徑是否與已有路徑相連。
myGraphicsPath.AddPath(&graphicsPath1, FALSE);
myGraphicsPath.AddPath(&graphicsPath2, TRUE);
另外還有2個項目您可以加入路徑中:字符串和餅圖。餅圖是橢圓的一部分。下面的例子將創(chuàng)建一個由弧線、基數(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);
下圖所示為這個路徑。注意這個路徑并沒有連接起來;弧線、基數(shù)樣條、字符串和餅圖都是相離的。

一個閉合圖形比如矩形和橢圓包含一個邊框和內(nèi)部區(qū)域。邊框是由Pen對象繪制,而內(nèi)部區(qū)域由Brush對象進行填充。Microsoft Windows GDI+提供幾種畫刷類用于填充閉合圖形的內(nèi)部區(qū)域:SolidBrush、HatchBrush、TextureBrush、LinearGradientBrush和PathGradientBrush。所有這些類都繼承于Brush類。下圖顯示了一個由純色畫刷填充的矩形和一個由陰影畫刷填充的橢圓。

· 純色畫刷
填充一個閉合圖形,您需要一個Graphics對象和一個Brush對象。Graphics對象提供方法,比如FillRectangle 和 FillEllipse,而Brush對象存儲諸如顏色和圖案等填充屬性。Brush對象的地址作為參數(shù)之一傳遞給填充方法。下面的例子將用實行紅色填充一個橢圓。
SolidBrush mySolidBrush(Color(255, 255, 0, 0));
myGraphics.FillEllipse(&mySolidBrush, 0, 0, 60, 40);
注意上例中,畫刷采用的是SolidBrush類型,它繼承于Brush。
· 陰影畫刷
當您需要填充一個陰影畫刷時,您需要指定其前景色、背景色和陰影樣式。前景色就是陰影的顏色。
HatchBrush myHatchBrush(
HatchStyleVertical,
Color(255, 0, 0, 255),
Color(255, 0, 255, 0));
GDI+提供了超過50種陰影樣式,這些樣式在HatchStyle中定義。下面顯示的3種陰影分別是水平、正向?qū)蔷€和十字交叉陰影。

· 紋理畫刷
通過紋理畫刷,您可以使用存儲于位圖中的紋理來填充圖形。例如,假設(shè)下面的圖形存儲在磁盤文件MyTexture.bmp中。

下面的例子將創(chuàng)建一個由MyTexture.bmp中存儲的圖片反復(fù)填充得到的橢圓。
Image myImage(L"MyTexture.bmp");
TextureBrush myTextureBrush(&myImage);
myGraphics.FillEllipse(&myTextureBrush, 0, 0, 100, 50);
下圖所示為填充結(jié)果:

· 漸變畫刷
您可以采用漸變畫刷填充一個圖形,使得該圖形可以從一個部分到另一部分由一種顏色漸變?yōu)槠渌伾?。例如,一個水平漸變畫刷將使得從左至右顏色漸變。下面的例子將采用水平漸變畫刷填充一個橢圓,從左至右顏色由藍色逐漸變?yōu)榫G色。
LinearGradientBrush myLinearGradientBrush(
myRect,
Color(255, 0, 0, 255),
Color(255, 0, 255, 0),
LinearGradientModeHorizontal);
myGraphics.FillEllipse(&myLinearGradientBrush, myRect);
下圖所示為填充后的橢圓:

路徑漸變畫刷允許您設(shè)置從中心向邊界漸變得畫刷。

路徑漸變畫刷非常靈活。下圖中用于填充三角形的漸變畫刷中心為紅色,向每個頂點漸變?yōu)?/font>3個不同的顏色。

下面顯示了兩個曲線:一個開放,一個閉合。

閉合曲線因為有內(nèi)部區(qū)域因而可以被畫刷填充。GDI+中的Graphcis類提供如下方法用于填充閉合圖形和曲線:FillRectangle、FillEllipse、FillPie、FillPolygon、FillClosedCurve、FillPath和FillRegion。任何時候在您調(diào)用這些方法的其中之一時,您必須將一個指定類型的畫刷(SolidBrush、HatchBrush、TextureBrush、LinearGradientBrush或者PathGradientBrush)地址作為參數(shù)之一傳入。
FillPie方法伴隨著DrawArc方法。正如DrawArc方法繪制橢圓邊界的一部分,FillPie方法填充橢圓內(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方法。這兩個方法都將終點自動連接起點從而使曲線閉合。下面的例子將繪制一條穿過(0, 0),(60, 20)和(40, 50)的曲線。然后該曲線通過連接(40, 50)和起點(0, 0)自動閉合,然后采用實行畫刷對該區(qū)域進行填充。
Point myPointArray[] =
{Point(10, 10), Point(60, 20),Point(40, 50)};
myGraphics.DrawClosedCurve(&myPen, myPointArray, 3);
myGraphics.FillClosedCurve(&mySolidBrush, myPointArray, 3, FillModeAlternate)
一條路徑可以包含多個圖形(子路徑)。FillPath方法填充每個圖形的內(nèi)部區(qū)域。如果一個圖形不是閉合的,那么FillPath方法將假設(shè)它是閉合的然后進行填充。下面的例子將填充一個由弧線、基數(shù)樣條、字符串和餅圖組成的路徑。
myGraphics.FillPath(&mySolidBrush, &myGraphicsPath);
myGraphics.DrawPath(&myPen, &myGraphicsPath);
下圖為該路徑采用純色畫刷填充前后的樣子。注意,采用DrawPath方法時,字符串描出輪廓,但是沒有填充。而FillPath方法將字符串各字符內(nèi)部進行了著色。

區(qū)域指的是顯示表面的一部分。區(qū)域可以簡單(單個矩形)也可以復(fù)雜(由一個由多邊形和閉合曲線組成)。下圖顯示了2個區(qū)域:一個由矩形構(gòu)成,另一個由路徑構(gòu)成。

通常區(qū)域用來裁剪 (Clipping) 和進行點擊測試 (Hit Testing)。裁剪包括限制對顯示區(qū)域的某個特定區(qū)域進行繪制,通常該區(qū)域為必須進行更新的部分。點擊測試包括檢查并判斷當按下鼠標按鈕時,光標是否位于屏幕的某個特定區(qū)域中。
您可以從矩形或路徑建立區(qū)域。您也可以通過組合現(xiàn)有的區(qū)域來建立復(fù)雜的區(qū)域。Region 類提供下列用來組合區(qū)域的方法:Intersect、Union、Xor、Exclude 和 Complement。
兩個區(qū)域的交集是指隸屬于這兩個區(qū)域的所有點的組合。聯(lián)集是指屬于其中一個或兩個區(qū)域的所有點的組合。區(qū)域的補碼 (Complement) 是指所有區(qū)域以外的點。下圖將顯示前圖所說明的兩個區(qū)域的交集和聯(lián)集。

套用到區(qū)域組的 Xor 方法會產(chǎn)生一個區(qū)域,其中含有隸屬于其中一個區(qū)域 (而非兩個) 的所有點。套用到區(qū)域組合的 Exclude 方法會產(chǎn)生一個區(qū)域,其中含有第一個區(qū)域中但位于第二個區(qū)域以外的所有點。下圖將顯示因套用 Xor 和 Exclude 方法到本主題一開始所說明的兩個區(qū)域時,所產(chǎn)生的區(qū)域。

若要繪制區(qū)域,您需要Graphics對象、Brush對象和Region對象。Graphics對象提供FillRegion方法,而Brush對象則是儲存填充的特性,例如色彩或圖樣。下列范例將純色填入?yún)^(qū)域中:
myGraphics.FillRegion(&mySolidBrush, &myRegion);
裁剪是指限制對特定區(qū)域進行繪制。下圖將顯示 "Hello" 字符串被裁剪為心形的區(qū)域。

區(qū)域可從路徑建立,而路徑中可包含字符串的字型外框,因此您可以使用外框文字來進行裁剪。下圖將顯示裁減為文字字符串內(nèi)景的一組同心橢圓。

若要使用裁剪來進行繪制,請建立Graphics對象,調(diào)用其SetClip方法,然后調(diào)用相同 Graphics 對象的繪圖方法。下例將繪制一條被矩形區(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);
下圖顯示了一個矩形區(qū)域裁剪的直線。

對象存儲一系列的線條和貝塞爾樣條。您可以加入多種類型的曲線(橢圓、弧線、基數(shù)樣條)到路徑中,但是其中每條曲線在存儲為路徑之前都將轉(zhuǎn)化為貝塞爾樣條。路徑平直化處理表示將路徑中的每條貝塞爾樣條轉(zhuǎn)化為一系列的直線。
若要平直化一條路徑,需要調(diào)用GraphicsPath對象的Flatten方法。Flatten方法有一個平直度的參數(shù),表示平直化后的路徑與原始路徑的最大距離。下圖顯示了一條路徑平直化處理前后的情形:

使用 GDI+ 繪制線條時,您必須提供線條的起始點和結(jié)束點,但不必提供該線條的個別像素相關(guān)信息。GDI+ 是與顯示驅(qū)動程序軟件搭配使用,來決定必須開啟哪些像素,才可以在特定顯示裝置上顯示該線條。
舉這條從點 (4, 2) 到點 (16, 10) 的直色紅線作為范例說明。假設(shè)坐標系統(tǒng)的原點在左上角,而度量單位為像素。同時我們也假設(shè) X 軸指向右方,而 Y 軸則向下延伸。下圖將顯示在多重色彩背景上繪制的紅色線條的放大畫面。

用來呈現(xiàn)線條的紅色像素是不透明的。這條直線的像素全部都是不透明的。此類線條繪制方式所產(chǎn)生的線條會出現(xiàn)鋸齒形的外觀,看起來有點像階梯。這種將線條繪制成階梯狀的技術(shù)稱為鋸齒 (Aliasing);這種階梯為理論線條的別名。
另一種更為復(fù)雜的繪制線條技術(shù)是同時使用透明的像素和不透明的像素。像素將設(shè)為純紅色或紅色與背景色彩的混色,但是這需要視像素與線條接近的程度。此類繪制方式稱為反鋸齒 (Antialiasing),可產(chǎn)生肉眼感覺更為平滑的線條。下圖將顯示某些像素將與背景混色以產(chǎn)生反鋸齒線條。

反鋸齒 (亦稱為平滑化) 也可套用至曲線。下圖將顯示平滑橢圓形的放大畫面。

下圖將顯示同一個橢圓形的實際大小,一個未使用反鋸齒功能,另一個則使用反鋸齒功能。

若要繪制使用平滑的線條和曲線,請先建立一個 Graphics 類對象,并傳遞SmoothingModeAntiAlias給它的SetSmoothingMode方法。然后,調(diào)用Graphics 類的相同的繪圖方法。
myGraphics.SetSmoothingMode(SmoothingModeAntiAlias);
myGraphics.DrawLine(&myPen, 0, 0, 12, 8);
SmoothingModeAntiAlias是SmoothingMode枚舉中的元素之一。
已發(fā)表 2007年2月6日 21:40 作者
wqw