VC15_13GDI+圖形編程_第1頁
VC15_13GDI+圖形編程_第2頁
VC15_13GDI+圖形編程_第3頁
VC15_13GDI+圖形編程_第4頁
VC15_13GDI+圖形編程_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、(12)圖形繪制圖形繪制暨南大學(xué)電氣信息學(xué)院嚴(yán)東松2013-2014學(xué)年第二學(xué)期第5章 GDI+編程基礎(chǔ)5.1 GDI+概述概述5.2 圖形繪制圖形繪制5.1 GDI+概述Y 5.1.1 GDI+的組成部分的組成部分 1二維矢量圖形二維矢量圖形二維矢量圖形是由繪圖的圖元(如直線、曲線和圖形等)組成,而這些圖元由二維坐標(biāo)系統(tǒng)中的一系列坐標(biāo)點組成。GDI+提供了相關(guān)的類來存儲這些圖元本身信息,并繪制這些圖元。例如,在.NET中的Rectangle類用來描述矩形的位置和尺寸;Pen類用來描述線條的顏色、粗細及線型等信息;而Graphics類則提供了用于繪制直線、矩形和其他圖形的方法。5.1.1 GD

2、I+的組成部分 2圖像處理圖像處理對于許多的圖片,基本上都難以以簡單的直線或曲線來描述圖像的信息,所以也無法通過使用二維矢量圖形方式進行處理。這種類型的圖像通常比矢量圖形要復(fù)雜得多,所以通過位圖來描述這類圖像信息。位圖存儲方式通過圖像表示在屏幕上獨立點的顏色值來描述圖像信息。GDI+提供了Bitmap、Image等類,它們可用于顯示、操作和保存BMP、JPG和GIF等圖像格式。 3文字顯示文字顯示文字顯示關(guān)系到多種文字的字體、尺寸及樣式顯示??梢岳肎DI+提供的子像素反鋸齒功能,以使文本在屏幕上呈現(xiàn)時顯得比較平滑。此外,Windows Froms還專門提供了TextReader類,以用于在W

3、indows窗體控件上測量和繪制文本。5.1.2 GDI+的接口架構(gòu)GDI+包含大約40個類、50個枚舉和6個結(jié)構(gòu)體,以及不屬于任何類的少數(shù)幾個公有函數(shù)。其中,Graphics類是整個GDI+接口的核心,它是實際進行線條、曲線、圖形、圖像和文本繪制的類。GDI+中常用的類及結(jié)構(gòu)如圖5.1所示。5.2 圖形繪制GDI+中的Graphics類具有繪圖、字體及顏色控制功能,并還提供了一系列與圖形、圖像有關(guān)的處理方法。Graphics類中常用的方法如表5.1所示。繪 圖 方 法說 明DrawArc繪制一段弧線,它表示由一對坐標(biāo)、寬度和高度指定的橢圓部分DrawBezier繪制由四個Point結(jié)構(gòu)定義的

4、貝濟埃曲線DrawCurve繪制一組經(jīng)過指定的Point結(jié)構(gòu)的基數(shù)線條DrawEllipse繪制一個由一對坐標(biāo)、高度和寬度指定的橢圓DrawLine繪制一條連接由坐標(biāo)對指定的兩個點的線段DrawPolygon繪制由一組Point結(jié)構(gòu)定義的多邊形DrawRectangle繪制由坐標(biāo)對、寬度和高度指定的矩形5.1.3 常用基本數(shù)據(jù)結(jié)構(gòu)1. Point、Size和和Rectangle結(jié)構(gòu)的構(gòu)造函數(shù)結(jié)構(gòu)的構(gòu)造函數(shù)Point結(jié)構(gòu)用來表示二維平面中定義的點或一個位置(x, y),其屬性有X和Y,分別表示點的水平坐標(biāo)和垂直坐標(biāo)。該結(jié)構(gòu)的構(gòu)造函數(shù)原型如下:Point( int dw );Point( Size

5、 sz );Point( int x, int y );Size結(jié)構(gòu)常用來表示一個矩形的大小,其屬性有Width和Height,分別表示水平寬度和垂直高度。該結(jié)構(gòu)的構(gòu)造函數(shù)原型如下:Size( Point pt );Size( int width, int height );5.1.3 常用基本數(shù)據(jù)結(jié)構(gòu)Rectangle結(jié)構(gòu)用來表示一個矩形的位置和大小,其屬性有:Width 矩形水平寬度Height 矩形垂直高度X、Y 矩形左上角的x,y坐標(biāo)Location 矩形左上角的Point位置Left 矩形左邊的x坐標(biāo)Right 矩形右邊的x坐標(biāo)Top 矩形上邊的y坐標(biāo)Bottom 矩形下邊的y坐標(biāo)R

6、ectangle的構(gòu)造函數(shù)原型如下:Rectangle( Point location, Size size );Rectangle( int x, int y, int width, int height );5.1.3 常用基本數(shù)據(jù)結(jié)構(gòu)2. 基本運算符操作基本運算符操作(1)“+”操作操作若向Point對象加上一個Size對象,則返回Point對象。例如:Drawing:Point pt = Drawing:Point(25,-18)+Drawing:Size(10,5);(2)“-”操作操作若從CPoint對象減去一個CSize對象,則返回一個CPoint對象。例如:Drawing:Po

7、int pt = Drawing:Point( 25, -19 ) + Drawing:Size( 15, 5 );9.1.3 常用基本數(shù)據(jù)結(jié)構(gòu)3. Rectangle結(jié)構(gòu)的常用操作結(jié)構(gòu)的常用操作(1)擴大或縮小)擴大或縮小成員方法Inflate用來擴大或縮小一個矩形,當(dāng)參數(shù)為負(fù)值時,則操作的結(jié)果是縮小矩形,其原型如下:void Inflate( Size size );void Inflate( int width, int height );(2)相交和合并)相交和合并成員方法Intersect和Union分別用來將兩個矩形進行相交和合并。它們的原型如下:void Intersect( R

8、ectangle rect );static Rectangle Intersect( Rectangle a, Rectangle b );/ 靜態(tài)方法static Rectangle Union( Rectangle a, Rectangle b );/ 靜態(tài)方法9.1.3 常用基本數(shù)據(jù)結(jié)構(gòu)(3)偏移)偏移Offset方法用來調(diào)整矩形的位置,但不改變大小,其原型如下:void Offset( Point pos );void Offset( int x, int y );(4)測試和判斷)測試和判斷IntersectsWith方法用來判斷是否和指定的矩形相交,若有相交,則返回true,否則

9、返回false,其原型如下:bool IntersectsWith( Rectangle rect );Contains方法用來判斷指定的點或矩形是否完全落在矩形中,若是,則返回true,否則返回false,其原型如下:bool Contains( Point pt );bool Contains( int x, int y );bool Contains( Rectangle rect );5.2 繪圖基礎(chǔ)5.2.1 使用使用GDI+的一般方法的一般方法在Windows窗體應(yīng)用程序中,窗體和控件常常需要繪制自己,以維持其界面的外觀,此時就會引發(fā)Paint事件,在該事件的處理方法中添加代碼就可

10、實現(xiàn)相應(yīng)的繪圖操作。:Void On_Paint(System:Object sender,System:Windows:Forms:PaintEventArgs e)e有兩個重要屬性:Cliprectangle-用于獲取在其中可以進行繪畫的區(qū)域大小Graphics-用于繪畫的Graphics對象下面來看一個示例,它是在窗體中繪制一個白色背景的矩形,并在其中繪制一個紅色的矩形框,如圖9.2所示。5.2.1 使用GDI+的一般方法【例例Ex_Draw】使用使用GDI+的一般方法的一般方法 創(chuàng)建一個Windows窗體應(yīng)用程序Ex_Draw。在打開的窗體設(shè)計器中,單擊Form1窗體,在窗體屬性窗口中

11、,將Text屬性內(nèi)容修改成“使用GDI+的一般方法”。 將窗體屬性窗口切換到事件頁面,為窗體添加Paint事件處理方法On_Paint,并添加下列代碼:private: System:Void On_Paint(System:Object sender, System:Windows:Forms:PaintEventArgs e) Graphics pGH= e-Graphics; Rectangle rc= e-ClipRectangle; / 繪制填充矩形 pGH-FillRectangle( Brushes:White,rc ); rc.Inflate( -20, -20 );/ 縮小矩

12、形 / 繪制矩形框 pGH-DrawRectangle( Pens:Red, rc ); 編譯并運行。5.2 圖形繪制在使用GDI+中的Graphics類繪制二維矢量圖形前,首先需要為Graphics對象創(chuàng)建相應(yīng)的Pen對象。創(chuàng)建Pen對象時可以設(shè)置線條的顏色和寬度,或者修改Pen對象的屬性以表示更多的特性,然后調(diào)用Graphics對象的相關(guān)繪圖方法如DrawLine和DrawRectangle等來繪制相應(yīng)的二維矢量圖形。例如:Graphics graphic = label-CreateGraphics(); / 取得Graphics對象Pen pen = gcnew Pen(Color(2

13、55, 255, 0, 0), 4);/ 創(chuàng)建Pen對象(紅色,寬度2)graphic-DrawRectangle(pen, rect(120, 120, 300, 300); / 繪制一個矩形5.2.1 畫筆Pen類Pen類指定了直線或線條的寬度和樣式。在創(chuàng)建Pen類的新對象時,可以為Pen類的實例指定初始顏色或?qū)挾?。其中,Pen類的Width屬性指定了繪制圖形對象的單位,而該度量單位通常為像素。PenType屬性用于描述線條的類型,其值由Pen類的Brush屬性確定。畫筆的類型及對應(yīng)的Brush類如表5.2所示。畫 筆 類 型Brush類描 述SolidColorSolidBrush畫筆的

14、最簡單形式,它用純色進行填充HatchFillHatchBrush類似于SolidBrush,用指定的圖案填充TextureFillTextureBrush使用紋理(如圖像)進行填充PathGradientPathGradientBrush根據(jù)指定的路徑使用漸變色進行填充LinearGradientLinearGradientBrush使用漸變混合的兩種顏色進行填充5.2.1 畫筆Pen類DashStyle屬性則指定了虛線的樣式,其值是由System:Drawing:Drawing2D命名空間中的DashStyle枚舉指定的。DashStyle枚舉中的成員及對應(yīng)的畫筆樣式如表5.3所示。畫 筆

15、 樣 式描 述圖 例Solid實線風(fēng)格Dash虛線風(fēng)格Dot點線風(fēng)格DashDot點畫線風(fēng)格DashDotDot雙點線風(fēng)格Custom用戶定義的線條樣式5.2.1 畫筆Pen類在創(chuàng)建Pen對象時,可以用指定的顏色或Brush對象來初始化Pen類的新實例,并且還可以為畫筆指定線條的寬度,默認(rèn)寬度為1個像素。例如:Pen pen1 = gcnew Pen(Color:Red); / 默認(rèn)寬度為1個像素的紅色畫筆Pen pen2 = gcnew Pen(Color:Blue, 2); / 寬度為2個像素的藍色畫筆Pen pen3 = gcnew Pen(Brushes:Gray);/ 具有灰色畫刷屬

16、性的1個像素寬的畫筆Pen pen4 = gcnew Pen(Brushes:Black, 5);/ 具有黑色畫刷屬性的5個像素框的畫筆pen4-DashStyle = DashStyle:Dash; / 虛線5.2.1 畫筆Pen類成 員 名 稱描 述表 現(xiàn) 樣 式Flat線帽樣式為平線帽Square線帽樣式為方線帽Round線帽樣式為圓線帽Triangle線帽樣式為三角線帽NoAnchor線帽樣式中沒有錨點SquareAnchor具有方形錨頭的線帽樣式RoundAnchor具有圓角錨頭的線帽樣式DiamondAnchor具有菱形錨頭的線帽樣式ArrowAnchor具有箭頭錨頭的線帽樣式在使

17、用該Pen對象繪制線條時,還可以通過Pen類的StartCap和EndCap屬性來指定線條的起始點和結(jié)束點的線帽樣式。其中,這兩個屬性由LineCap枚舉指定,其表現(xiàn)樣式可以為扁平、方塊、圓角、三角或者用戶定義形狀等。LineCap枚舉中的成員及其對應(yīng)的表現(xiàn)樣式如表5.4所示。5.2.3 畫筆自定義畫筆自定義畫筆在工程應(yīng)用中,預(yù)定義樣式DashStyle的畫筆有時并不能滿足實際的需求,此時需要通過Pen類的DashPattern屬性來指定,并須將DashStyle屬性設(shè)置為DashStyle:Custom?!纠鼸x_CustomPen】使用自定義畫筆使用自定義畫筆 創(chuàng)建一個Windows窗體

18、應(yīng)用程序Ex_CustomPen。在打開的窗體設(shè)計器中,單擊Form1窗體,在窗體屬性窗口中,將Text屬性內(nèi)容修改成“使用自定義畫筆”。 將窗體屬性窗口切換到事件頁面,為窗體添加Paint事件處理方法On_Paint,并添加下列代碼:private: System:Void On_Paint(System:Object sender,System:Windows:Forms:PaintEventArgs e) Graphics pGH = e-Graphics; pGH-PageUnit = GraphicsUnit:Millimeter;/ 設(shè)單位為mm / 設(shè)置圖形顯示質(zhì)量為高品質(zhì) pG

19、H-SmoothingMode = Drawing2D:SmoothingMode:HighQuality; Pen pPen = gcnew Pen( Color:Black, 1.5); / 畫粗實線圓,線寬為1.5mm pGH-DrawArc( pPen, 10, 10, 40, 40, 0, 360 ); array dashVals = gcnew array 30.0f, / 短劃長短劃長 2.0f,/ 間隔間隔 2.0f,/ 短劃長短劃長 2.0f/ 間隔間隔 ; pPen-DashStyle = Drawing2D:DashStyle:Custom; pPen-DashPatt

20、ern= dashVals; / 在工程上,細線線寬是粗線線寬的1/3,為0.5mm pPen-Width= 0.5; pGH-DrawLine( pPen, 5, 30, 55, 30 );/ 畫水平點劃線 pGH-DrawLine( pPen, 30, 5, 30, 55 );/ 畫垂直點劃線9.2.3 畫筆 編譯運行,結(jié)果如圖9.5所示。5.2.2 畫刷Brush類 1SolidBrushSolidBrush類表示一個實心畫刷,用于以純色來填充圖形,并且被包含在與Bursh類相同的命令空間System:Drawing中。當(dāng)需要創(chuàng)建一個實心畫刷時,通過將保存在Color對象的顏色值傳遞給S

21、olidBrush類的構(gòu)造函數(shù)來實現(xiàn)。例如:SolidBursh bush1 = gcnew SolidBrush(Color:Blue); / 創(chuàng)建藍色的實心畫刷5.2.2 畫刷Brush類2HatchBrushHatchBrush類中定義了54種不同的陰影樣式。其中該類的ForegroundColor屬性定義了線條的前景顏色值,BackgroundColor屬性定義了各線條之間間隙的背景顏色值,而HatchSyle屬性則指定了實際的陰影樣式。HatchBrush中的部分陰影樣式如表5.5所示。陰 影 樣 式圖 例陰 影 樣 式圖 例BackwardDiagonoalLargeGridCro

22、ssLightDownwardDiagonalDarkDownwardDiagonalLightHorizontalDarkHorizontalLightUpwardDiagonalDarkUpwardDiagonalLightVerticalDarkVerticalNarrowHorizontalDashedHorizontalOutlinedDiamandDashedVerticalShingleDiagonalBrickSmallCheckerBoardDiagonalCrossSmallConfettiDottedDiamondSolidDimandHorizontalVertical

23、HorizontalBrickWaveLargeConfettiZigZag【例例Ex_Hatch】Hatchstyle枚舉圖例枚舉圖例 創(chuàng)建一個Windows窗體應(yīng)用程序Ex_Hatch。在打開的窗體設(shè)計器中,單擊Form1窗體,在窗體屬性窗口中,將Text屬性內(nèi)容修改成“Hatchstyle枚舉圖例”。 在窗體屬性窗口中,單擊窗體字體屬性Font右側(cè)的 按鈕,從彈出的字體對話框中選擇“Arial,六號”字體,并將窗體背景顏色屬性BackColor選擇為“Web”頁面中的“White”顏色,窗體大小屬性Size設(shè)為640,510。 將窗體屬性窗口切換到事件頁面,為窗體添加Paint事件處理方

24、法On_Paint,并添加下列代碼。private: System:Void On_Paint(System:Object sender, System:Windows:Forms:PaintEventArgs e) Graphics pGH = e-Graphics; / 獲取HatchStyle所有枚舉值的名稱 array styleNames = Enum:GetNames( Drawing2D:HatchStyle:typeid ); / 定義圖例和樣式名稱顯示的起點 Rectangle hatchRect = Rectangle( 0, 0, 100, 20 ); hatchRect

25、.Offset( 5, 5 ); PointF pt; / 繪制圖例和樣式名稱 for each ( String item in styleNames ) / 將item名稱的樣式轉(zhuǎn)換成HatchStyle枚舉對象 Object oItem = Enum:Parse( Drawing2D:HatchStyle:typeid, item ); / 將Object轉(zhuǎn)換成HatchStyle枚舉類型 Drawing2D:HatchStyle curStyle = ( Drawing2D:HatchStyle )( oItem ); / 構(gòu)造一個圖案畫刷 Drawing2D:HatchBrush b

26、rush = gcnew Drawing2D:HatchBrush( curStyle, Color:Black, Color:LightSkyBlue); / 填充矩形 pGH-FillRectangle( brush, hatchRect ); / 繪制樣式名稱 pt.X = (float)hatchRect.X; pt.Y = (float)hatchRect.Bottom; pGH-DrawString( item, this-Font, Brushes:Black, pt ); hatchRect.Offset( 130, 0 ); if ( hatchRect.Right e-Cl

27、ipRectangle.Right ) hatchRect.Offset( 0, 40 ); hatchRect.X = 0; hatchRect.Offset( 5, 0 ); 編譯運行,結(jié)果如圖9.6所示。5.2.2 畫刷Brush類3TextureBrush紋理畫刷TextureBrush類提供了用保存在圖像文件中的圖案來填充圖形的紋理畫刷,其中這些圖像文件可以是bmp、jpg、ico及gif等格式的文件。TextureBrush類被包含在System:Drawing命名空間中。在創(chuàng)建一個紋理畫刷時,可以通過將已加載圖像的Image對象及由WrapMode枚舉指定填充圖形的紋理樣式傳遞給

28、TextureBrush類的構(gòu)造函數(shù)來實現(xiàn)。例如:Image image = Image:FromFile(Lbackground.bmp); / 加載填充圖像文件TextureBrush brush = gcnew TextureBrush(image, WrapMode:Tile); / 創(chuàng)建紋理畫刷5.2.2 畫刷Brush類枚舉類型WrapMode被包含在System:Drawing:Drawing2D命名空間中,用于指定當(dāng)紋理或漸變小于所填充的區(qū)域時平鋪紋理或漸變的方式。WrapMode枚舉中的紋理樣式如表5.6所示。紋 理 樣 式說 明Clamp把紋理或傾斜度固定在邊界上,紋理或漸

29、變沒有平鋪Tile使傾斜度或紋理平鋪TileFlipX水平顛倒傾斜度或紋理,然后平鋪傾斜度或紋理TileFlipY垂直顛倒傾斜度或紋理,然后平鋪傾斜度或紋理TileFlipXY水平和垂直顛倒傾斜度或紋理,然后平鋪傾斜度或紋理畫刷例如,下面的示例是通過設(shè)定紋理的圖像區(qū)域和不同的平鋪方式來填充區(qū)域,結(jié)果如圖9.7所示。取此區(qū)域圖像為畫刷紋理畫刷【例例Ex_Texture】使用紋理畫刷使用紋理畫刷創(chuàng)建一個Windows窗體應(yīng)用程序Ex_Texture。在打開的窗體設(shè)計器中,單擊Form1窗體,在窗體屬性窗口中,將Text屬性內(nèi)容修改成“使用紋理畫刷”。在窗體的屬性窗口中,單擊BackgroundIm

30、age屬性右側(cè)的 按鈕,在打開的文件對話框中指定一個圖片文件(如系統(tǒng)“圖片收藏”“示例圖片”夾中的Blue hills.jpg)。將窗體屬性窗口切換到事件頁面,為窗體添加Paint事件處理方法On_Paint,并添加下列代碼。編譯運行。 Graphics pGH= e-Graphics; Rectangle rcCirle= Rectangle( 0, 0, 100, 100); rcCirle.Offset( 20, 20 ); Image img= this-BackgroundImage; Rectangle rc1= Rectangle( 0, 0, 30, 30); rc1.Offs

31、et(0, img-Height - 50); pGH-DrawRectangle( Pens:Blue, rc1 ); / 畫出取紋理圖像的區(qū)域TextureBrush brush = gcnew TextureBrush( img, rc1 ); / 定義一個紋理畫刷 / 按默認(rèn)平捕方式填充 pGH-FillRectangle( brush, rcCirle ); pGH-DrawRectangle( Pens:Blue, rcCirle ); / 按Clamp平捕方式填充 rcCirle.Offset( 120, 0 ); brush-WrapMode = Drawing2D:WrapM

32、ode:Clamp; pGH-FillRectangle( brush, rcCirle ); pGH-DrawRectangle( Pens:Blue, rcCirle ); / 按TileFlipX平捕方式填充 rcCirle.Offset( 120, 0 ); brush-WrapMode = Drawing2D:WrapMode:TileFlipX; pGH-FillRectangle( brush, rcCirle ); pGH-DrawRectangle( Pens:Blue, rcCirle ); / 按TileFlipXY平捕方式填充 rcCirle.Offset( 120,

33、0 ); brush-WrapMode = Drawing2D:WrapMode:TileFlipXY; pGH-FillRectangle( brush, rcCirle ); pGH-DrawRectangle( Pens:Blue, rcCirle );5.2.2 畫刷Brush類4LinearGradientBrush漸變畫刷在創(chuàng)建漸變畫刷對象時,除需要指定漸變的起始色和結(jié)束色外,還需要由Rectangle結(jié)構(gòu)或Point結(jié)構(gòu)指定漸變的范圍和速度。如果實際填充的圖形區(qū)域比這個范圍小,則只有部分的顏色被填充到區(qū)域中;如果實際填充的圖形區(qū)域比這個范圍大,則漸變顏色會被重復(fù)多次以填充整個區(qū)域

34、。例如:Rectangle rect(0, 0, 100, 100); / 漸變范圍LinearGradientBrush brush = gcnew LinearGradientBrush(rect, Color:Red, Color:Black, LinearGradientMode:ForwardDiagonal); / 漸變畫刷畫刷5. 路徑漸變畫刷(路徑漸變畫刷(PathGradientBrush)PathGradientBrush類封裝了路徑漸變畫刷功能,它常用的構(gòu)造函數(shù)如下:PathGradientBrush( GraphicsPath path);PathGradientBru

35、sh( array points);PathGradientBrush( array points, WrapMode wrapMode);【例例Ex_Gradient】使用漸變畫刷使用漸變畫刷 創(chuàng)建一個Windows窗體應(yīng)用程序Ex_Gradient。在打開的窗體設(shè)計器中,單擊Form1窗體,在窗體屬性窗口中,將Text屬性內(nèi)容修改成“使用漸變畫刷”。 將窗體屬性窗口切換到事件頁面,為窗體添加Paint事件處理方法On_Paint,并添加下列代碼。 Graphics pGH = e-Graphics; double r = 50.0;/ 正六邊形外接圓直徑 double angle = 0.

36、0; array pt = gcnew array(6); for (int i=0; i6; i+)/ 計算六邊形頂點坐標(biāo) pti.X = (int)( r * Math:Cos( angle ) + 50; pti.Y = (int)( r * Math:Sin( angle ) + 50; angle += 60.0 * Math:PI / 180.0; / 定義各個點的顏色 array colors = gcnew array(6); colors0 = Color:Red; colors1 = Color:Green; colors2 = Color:Blue; colors3 =

37、Color:AliceBlue; colors4 = Color:LightPink; colors5 = Color:Azure; / 定義并創(chuàng)建一個正六邊形路徑 Drawing2D:GraphicsPath path = gcnew Drawing2D:GraphicsPath(); path-AddLines( pt ); / 創(chuàng)建一個路徑漸變畫刷 Drawing2D:PathGradientBrush pathBrush = gcnew Drawing2D:PathGradientBrush( path ); / 或直接通過點來創(chuàng)建 / Drawing2D:PathGradientBr

38、ush pathBrush = / gcnew Drawing2D:PathGradientBrush( pt ); 編譯運行,調(diào)整窗體大小,繪制的內(nèi)容完全顯示出來,結(jié)果如圖9.8所示。 pathBrush-CenterPoint= Point( 30, 30 ); pathBrush-CenterColor= Color:Yellow; pathBrush-SurroundColors= colors; / 創(chuàng)建一個線性漸變畫刷 Drawing2D:LinearGradientBrush lineBrush = gcnew Drawing2D:LinearGradientBrush( Rec

39、tangle(0,0,20,20) , Color:Red, Color:Blue, Drawing2D:LinearGradientMode:BackwardDiagonal ); Rectangle rc = Rectangle( 0, 0, 150, 100 ); rc.Offset( 50, 30 ); pGH-FillPath( pathBrush, path );/ 使用路徑漸變畫刷填充 pGH-FillRectangle( pathBrush, rc );/ 使用路徑漸變畫刷填充 pGH-DrawRectangle( Pens:Blue, rc ); rc.Offset( 180

40、, 0 ); pGH-FillRectangle( lineBrush, rc );/ 使用線性漸變畫刷填充5.2.3 繪制二維圖形-基本繪圖方法表9.3列出了這些基本繪圖方法。繪圖方法繪圖方法功能描述功能描述DrawArc繪制一條圓弧曲線,范圍由起止角大小決定,大小由矩形或長寬值指定DrawBezier繪制一條由一系列型值頂點決定的三次Bezier曲線DrawBeziers繪制一系列的三次Bezier曲線DrawClosedCurve繪制一條封閉的樣條曲線DrawCurve繪制一條樣條曲線DrawEllipse繪制一條橢圓輪廓線,大小由矩形或長寬值指定DrawLine繪制一條直線DrawPa

41、th繪制由GraphicsPath定義的路徑輪廓線DrawPie繪制一條扇形(餅形)輪廓線DrawPolygon繪制一個多邊形的輪廓線DrawRectangle繪制一個矩形FillEllipse填充一個橢圓區(qū)域FillPath填充一個由路徑指定的區(qū)域FillPie填充一個扇形(餅形)區(qū)域FillPolygon填充一個多邊形區(qū)域FillRectangle填充一個矩形區(qū)域FillRectangles用同一個畫刷填充一系列矩形區(qū)域FillRegion填充一個區(qū)域(Region)的內(nèi)部5.2.3 繪制二維圖形 1繪制直線繪制直線Graphics類的DrawLine方法用于繪制一條連接由坐標(biāo)對指定的兩個

42、點的線條。該方法根據(jù)傳遞的Pen對象及由Point結(jié)構(gòu)指定的兩點間繪制直線。DrawLine方法的聲明如下:void DrawLine( Pen pen, Point pt1, Point pt2 );void DrawLine( Pen pen, int x1, int y1, int x2, int y2 );Pen參數(shù)表示用于繪制線條的畫筆對象,在調(diào)用DrawLine方法之前應(yīng)該已經(jīng)被創(chuàng)建;pt1和pt2分別代表直線的起點和終點,而x1、y1、x2和y2分別表示由整數(shù)類型表示的起點和終點的坐標(biāo)。5.2.3 繪制二維圖形 2繪制基數(shù)線條繪制基數(shù)線條基數(shù)線條是平滑地通過一組給定點的曲線,由一

43、系列點和張力參數(shù)定義,即曲線平滑地通過系列中的每個點,張力參數(shù)影響曲線的彎曲方式。當(dāng)繪制基數(shù)線條時,首先需要創(chuàng)建Graphics對象,并將一個Point結(jié)構(gòu)的數(shù)組傳遞給DrawCurve方法。DrawCurve方法的聲明如下:void DrawCurve( Pen pen, array points );void DrawCurve( Pen pen, array points, float tension );points參數(shù)是一個Point結(jié)構(gòu)數(shù)組,其中包含了用于定義線條的一組頂點;tension參數(shù)指定曲線的張力參數(shù),該參數(shù)用于表示基數(shù)線條的彎曲幅度,其取值范圍在0.0F到1.0F之間,

44、若該值為0.0F時,DrawCurve方法將以直線段連接各點。5.2.3 繪制二維圖形3繪制貝濟埃曲線繪制貝濟埃曲線 Bezier曲線是最常見的非規(guī)則曲線之一,該曲線屬于三次曲線。貝濟埃線條由兩個端點和兩個控制點定義,即該曲線不通過控制點,但是控制點影響曲線從一個端點到另一個端點時的方向和彎曲程度。通過四個點便能夠繪制該曲線,其中第一和第四個點是端點,而其他兩個點是控制點,如圖5.2所示。Graphic類提供了DrawBezier方法來繪制貝濟埃曲線,該方法的聲明如下:void DrawBezier( Pen pen, Point pt1, Point pt2, Point pt3, Poin

45、t pt4 );void DrawBezier( Pen pen, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4 );5.2.3 繪制二維圖形 4繪制矩形繪制矩形Graphics類的DrawRectangle方法用于繪制由坐標(biāo)對、寬度和高度指定的矩形。DrawRectangle方法的聲明如下:void DrawRectangle( Pen pen, Rectangle rect );void DrawRectangle( Pen pen, int x, int y, int widt

46、h, int height );參數(shù)Pen是需要使用的畫筆對象,在調(diào)用DrawRectangle方法之前應(yīng)該已經(jīng)被創(chuàng)建。x和y表示矩形的左上角坐標(biāo),而width和height指定了矩形的寬度和高度。同時,還可以通過Rectangle結(jié)構(gòu)來指定繪制的矩形。5.2.3 繪制二維圖形 5繪制多邊形繪制多邊形多邊形是由三個或三個以上的直邊所組成的閉合圖形。Graphics類中的DrawPolygon方法可以根據(jù)指定的頂點來繪制多邊形。DrawPolygon方法的聲明如下:void DrawPolygon( Pen pen, array points );points參數(shù)是一個Point結(jié)構(gòu)的數(shù)組。數(shù)組

47、中的每一個元素都代表多邊形的一個頂點,兩個相鄰的頂點構(gòu)成一條邊。若最后一個頂點與第一個頂點不一致,將把它們連成線構(gòu)成最后一條邊。5.2.3 繪制二維圖形 6繪制圓和橢圓繪制圓和橢圓圓和橢圓都是用Graphics類的DrawEllipse方法來繪制的。傳遞給DrawEllipse方法的參數(shù)同樣是一個矩形,而該矩形作為所畫的圓或橢圓的外接矩形,并決定圓或橢圓的大小和形狀。DrawEllipse方法的聲明如下:void DrawEllipse( Pen pen, Rectangle rect );void DrawEllipse( Pen pen, int x, int y, int width,

48、int height );5.2.3 繪制二維圖形 7繪制弧線繪制弧線弧線是圓或橢圓的圓周的一部分,可以通過Graphics類的DrawArc方法來繪制。DrawArc方法的參數(shù)同樣需要指定一個圓或橢圓的外接矩形,另外還需要指定起始角和掃描角。DrawArc方法的聲明如下:void DrawArc( Pen pen, Rectangle rect, float startAngle, float sweepAngle );void DrawArc( Pen pen, int x, int y, int width, int height, int startAngle, int sweepAn

49、gle );void DrawArc( Pen pen, float x, float y, float width, float height, float startAngle, float sweepAngle );5.2.3 繪制二維圖形起始角startAngle指定了弧線的起始角度,該角度的度量是以圓或橢圓向右的半徑為0度,按順時針方向增加。而掃描角sweepAngle表示從起始角開始,按順時針方向增加的角度。起始角和掃描角的值都可以是正值(順時針),也可以是負(fù)值(逆時針)。如圖5.3所示。5.2.3 繪制二維圖形8繪制餅形圖繪制餅形圖餅形圖也稱為扇形圖,它是圓或橢圓的一部分,但與弧

50、線不同,餅圖是由弧和連接弧線兩個端點的半徑組成。餅形圖通過Graphics對象的DrawPie方法畫制,它的使用方法與DrawArc方法完全相同,如圖5.3所示。DrawPie方法的聲明如下:void DrawPie( Pen pen, Rectangle rect, float startAngle, float sweepAngle );void DrawPie( Pen pen, int x, int y, int width, int height, int startAngle, int sweepAngle );void DrawPie( Pen pen, float x, flo

51、at y, float width, float height, float startAngle, float sweepAngle );5.2.4 繪圖和填充示例下面通過一個示例來了解使用Graphics對象繪制、填充圖形的一般方法。該示例將在窗體中繪制一個餅形圖,用來表示一個班級某門課程的成績分布。在餅形圖中根據(jù)成績劃分為五個部分,分別表示60分以下、6069分、7079分、8089分和90分以上分?jǐn)?shù)段的人數(shù)比例,如圖5.4所示。5.2.4 繪圖和填充示例【例5.1】 繪制課程的成績分布圖。(1)創(chuàng)建一個項目名稱為Ex5_1的Windows窗體應(yīng)用程序項目,適當(dāng)調(diào)整窗體的大小,并修改窗體

52、的Text屬性為“成績分布圖”。(2)為Form1類添加一個成員方法DrawScore,其中分別包含一個Graphics對象和double類型數(shù)組對象的參數(shù)。然后在該方法中統(tǒng)計各個分?jǐn)?shù)段的人數(shù),并分別繪制直方圖、曲線圖和餅形圖。代碼如下。System:Void DrawScore(System:Drawing:Graphics g, array score) array scoreNum = gcnew array(5)0; for each (double s in score) if (s = 90) scoreNum0+; / 統(tǒng)計各分?jǐn)?shù)段的人數(shù) else if (s = 80) sco

53、reNum1+; else if (s = 70) scoreNum2+; else if (s = 60) scoreNum3+; else scoreNum4+; / 小于60分的人數(shù) FontFamily fontFamily = gcnew FontFamily(L宋體); / 宋體字體 Drawing:Font font = gcnew Drawing:Font(fontFamily, 10, FontStyle:Regular); SolidBrush brush1 = gcnew SolidBrush(Color:Black);/* 繪制直角坐標(biāo)系的兩條坐標(biāo)線及文字 */ Pen

54、 pen1 = gcnew Pen(Color:Black); pen1-EndCap = LineCap:ArrowAnchor; / 末端帶箭頭 g-DrawLine(pen1, 20, 200, 20, 20); / 垂直線 g-DrawLine(pen1, 20, 200, 320, 200); / 水平線 g-DrawString(L人數(shù), font, brush1, 20, 20); g-DrawString(LDrawString(L60-70, font, brush1, 90, 210); g-DrawString(L70-80, font, brush1, 140, 210

55、); g-DrawString(L80-90, font, brush1, 190, 210); g-DrawString(L=90, font, brush1, 240, 210); g-DrawString(L分?jǐn)?shù)段, font, brush1, 280, 210); array points = gcnew array Point( 60, 240-15*scoreNum4), Point(110, 240-15*scoreNum3), Point(160, 240-15*scoreNum2), Point(210, 240-15*scoreNum1), Point(260, 240-1

56、5*scoreNum0) ; array brushes = gcnew array gcnew HatchBrush(HatchStyle:LightVertical, Color:Red, Color:Gray), gcnew HatchBrush(HatchStyle:LightDownwardDiagonal, Color:Yellow, Color:Blue), gcnew HatchBrush(HatchStyle:LightHorizontal, Color:White, Color:Green), gcnew HatchBrush(HatchStyle:LightUpwardD

57、iagonal, Color:Yellow, Color:Orange), gcnew HatchBrush(HatchStyle:OutlinedDiamond, Color:Blue, Color:Red), ; /* 直方圖 */ for (int i=4; i=0; i-) g-FillRectangle(brushesi, pointsi.X-25, pointsi.Y, 50, 200-pointsi.Y); g-DrawString(scoreNumi+L人, font, brush1, pointsi.X-10, pointsi.Y-15); /* 曲線圖 */ Pen pen

58、2 = gcnew Pen(Color:Blue, 2); g-DrawCurve(pen2, points); / 基數(shù)曲線 /* 餅形圖 */ float startAngle = 0.0f, sweepAngle = 0.0f; for (int i=4; i=0; i-) startAngle = startAngle + sweepAngle; / 起始角度 sweepAngle = (float)scoreNumi*360/score-Length; / 掃描角度 g-FillPie(brushesi, Rectangle(340, 40, 180, 180), startAngl

59、e, sweepAngle); 5.2.4 繪圖和填充示例(3)在“屬性”窗口中為Form1窗體添加Paint事件的處理方法,并在該方法定義一個包含一組成績值的數(shù)組,調(diào)用DrawScore方法繪制成績分布圖。代碼如下:System:Void Form1Paint(System:Object sender, System:Windows:Forms:PaintEventArgs e) array score = gcnew array / 40個成績值 66,82,79,74,86,67,60,45,44,77, 98,65,90,66,76,66,62,83,84,97, 43,67,57,6

60、0,60,71,74,60,72,81, 69,79,91,69,71,42,82,77,69,81, ; DrawScore(e-Graphics, score); / 繪制成績分布圖(4)選擇“生成”“生成解決方案”菜單命令以生成項目,并選擇“調(diào)試”“開始執(zhí)行(不調(diào)試)”菜單命令運行項目。Ex5_1項目的運行結(jié)果如圖5.4所示。9.2.5 基本繪圖方法下面來看一個示例,如圖9.9所示。該示例是根據(jù)用戶用鼠標(biāo)指定的一組點來畫出連續(xù)折線、封閉多邊形和樣條曲線。 9.2.5 基本繪圖方法【例例Ex_Curve】繪圖示例繪圖示例 創(chuàng)建一個Windows窗體應(yīng)用程序Ex_Curve。在打開的窗體設(shè)計

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論