电竞比分网-中国电竞赛事及体育赛事平台

分享

GDI+ SDK參考

 whli88 2007-09-23

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)鍵性信息。例如,您可以通過2點(diǎn)確定一條線段,您可以通過一個(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ì)象:DrawLineDrawRectangle、DrawEllipseDrawPolygon、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、DrawRectanglesDrawBeziers。同樣地,DrawCurve方法也有一個(gè)伴隨方法DrawClosedCurve,該函數(shù)通過連接曲線的起點(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è)置更多的線條屬性。SetStartCapSetEndCap方法指定線條末端的表現(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)信息。例如,InflateOffset方法可以改變矩形的尺寸和位置。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ù)樣條平滑地穿過數(shù)組中的每一個(gè)點(diǎn);在曲線的密度上不會(huì)不出現(xiàn)銳角和突變。下圖顯示一組點(diǎn)和穿過它們每個(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)的曲線。正如物理樣條通過給定的一組點(diǎn)時(shí)在不同的張力下的將生成一條不同的曲線一樣, 數(shù)學(xué)樣條在張力參數(shù)不同的時(shí)候也將生成不同的曲線。下圖顯示了通過相同一組點(diǎn)集的4條基數(shù)樣條。每條樣條都標(biāo)注了它的張力參數(shù)。注意張力系數(shù)為0的情況下相當(dāng)于無(wú)限的物理張力,迫使曲線走點(diǎn)之間的最短路徑(直線)。張力系數(shù)為1表示沒有物理張力,此時(shí)樣條采用最小彎程。如果張力系數(shù)大于1,此時(shí)的樣條看起來(lái)就像被壓扁的彈簧,被迫經(jīng)過更長(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)過的點(diǎn)集。下面的例子將繪制一條基數(shù)樣條,它穿過myPointArray點(diǎn)集。第三個(gè)參數(shù)是張力參數(shù)。

myGraphics.DrawCurve(&myPen, myPointArray, 3, 1.5f);

貝塞爾樣條

貝塞爾樣條是由4個(gè)點(diǎn)所確定的曲線:2個(gè)端點(diǎn)(p1p2)和2個(gè)控制點(diǎn)(c1c2)。曲線始于p1終于p2。曲線并不經(jīng)過控制點(diǎn),但是控制點(diǎn)扮演了磁鐵的角色,將曲線往某個(gè)方向拉從而影響了曲線的走向。下圖顯示了貝塞爾樣條和它的頂點(diǎn)以及控制點(diǎn)。

注意,曲線從p1開始向控制點(diǎn)c1移動(dòng)。P1位置的切線是從p1c1。同時(shí)請(qǐng)注意,終點(diǎn)p2處的切線是從c2p2的。

繪制貝塞爾樣條,您需要一個(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è)一組線條、矩形、多邊形和曲線可以通過Graphcis類的DrawPath方法一次性繪制。下圖顯示的是一條有線條、弧線、貝塞爾樣條以及基數(shù)樣條所組成的路徑。

GraphicsPath類提供如下方法用于創(chuàng)建一系列對(duì)象:AddLine、AddRectangle、AddEllipse、AddArc、AddPolygonAddCurve (用于基數(shù)樣條)以及AddBezier。它們中的每個(gè)方法都已被重載;也就是說(shuō),您可以傳入不同的參數(shù)列表。例如,AddLine方法的變體之一需要傳入4個(gè)整形值,而另外一個(gè)變體則需要傳入2個(gè)Point對(duì)象。

添加線條、矩形和貝塞爾樣條的方法都有其復(fù)數(shù)形式的伴隨方法,這些方法在一次調(diào)用中添加多個(gè)項(xiàng)目:AddLines、AddRectanglesAddBeziers。同樣地,AddCurve方法也有一個(gè)伴隨方法AddClosedCurve,該函數(shù)通過連接曲線的起點(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ù)雜的路徑。下面的代碼將graphicsPath1graphicsPath2加入到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、HatchBrushTextureBrushLinearGradientBrushPathGradientBrush。所有這些類都繼承于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+提供了超過50種陰影樣式,這些樣式在HatchStyle中定義。下面顯示的3種陰影分別是水平、正向?qū)蔷€和十字交叉陰影。

·         紋理畫刷

通過紋理畫刷,您可以使用存儲(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)?/font>3個(gè)不同的顏色。

開放與閉合曲線

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

閉合曲線因?yàn)橛袃?nèi)部區(qū)域因而可以被畫刷填充。GDI+中的Graphcis類提供如下方法用于填充閉合圖形和曲線:FillRectangle、FillEllipse、FillPieFillPolygon、FillClosedCurve、FillPathFillRegion。任何時(shí)候在您調(diào)用這些方法的其中之一時(shí),您必須將一個(gè)指定類型的畫刷(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方法。這兩個(gè)方法都將終點(diǎn)自動(dòng)連接起點(diǎn)從而使曲線閉合。下面的例子將繪制一條穿過(0, 0),(60, 20)(40, 50)的曲線。然后該曲線通過連接(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ū)域。您也可以通過組合現(xiàn)有的區(qū)域來(lái)建立復(fù)雜的區(qū)域。Region 類提供下列用來(lái)組合區(qū)域的方法:Intersect、UnionXor、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);

SmoothingModeAntiAliasSmoothingMode枚舉中的元素之一。

已發(fā)表 2007年2月6日 21:40 作者 wqw


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多