![第5章圖形圖像編程_第1頁](http://file3.renrendoc.com/fileroot3/2021-11/28/412c2347-ba15-4d72-9720-1aebe26c0f91/412c2347-ba15-4d72-9720-1aebe26c0f911.gif)
![第5章圖形圖像編程_第2頁](http://file3.renrendoc.com/fileroot3/2021-11/28/412c2347-ba15-4d72-9720-1aebe26c0f91/412c2347-ba15-4d72-9720-1aebe26c0f912.gif)
![第5章圖形圖像編程_第3頁](http://file3.renrendoc.com/fileroot3/2021-11/28/412c2347-ba15-4d72-9720-1aebe26c0f91/412c2347-ba15-4d72-9720-1aebe26c0f913.gif)
![第5章圖形圖像編程_第4頁](http://file3.renrendoc.com/fileroot3/2021-11/28/412c2347-ba15-4d72-9720-1aebe26c0f91/412c2347-ba15-4d72-9720-1aebe26c0f914.gif)
![第5章圖形圖像編程_第5頁](http://file3.renrendoc.com/fileroot3/2021-11/28/412c2347-ba15-4d72-9720-1aebe26c0f91/412c2347-ba15-4d72-9720-1aebe26c0f915.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、1第五章第五章 圖形圖像編程圖形圖像編程 本章的目的是學習使用本章的目的是學習使用GDI+的圖形圖像編程方的圖形圖像編程方法,希望在學習本章以后,能編制像法,希望在學習本章以后,能編制像Windows畫圖畫圖那樣的程序。本章的重點是學習創(chuàng)建畫筆、畫刷那樣的程序。本章的重點是學習創(chuàng)建畫筆、畫刷等繪圖工具,學習使用等繪圖工具,學習使用Graphics類的繪圖函數(shù)繪制類的繪圖函數(shù)繪制各種圖形,學習利用各種圖形,學習利用Bitmap類處理圖形和圖像,類處理圖形和圖像,最后簡單介紹多媒體和最后簡單介紹多媒體和3D圖形程序設計的基礎知圖形程序設計的基礎知識。識。 25.1 5.1 GDI+(圖形設備環(huán)境接
2、口圖形設備環(huán)境接口) GDI+是是2D(2維維)圖形庫,它允許程序員用庫中的函數(shù)編寫圖形庫,它允許程序員用庫中的函數(shù)編寫與顯視器、打印機和文件等圖形設備進行交互的與顯視器、打印機和文件等圖形設備進行交互的Windows和和Web應用程序應用程序,可以在這些設備上輸出字符和可以在這些設備上輸出字符和2D圖形。圖形。Windows和和Web應用程序應用程序根據(jù)是在根據(jù)是在CRT顯示還是在打印機顯示還是在打印機打印,首先生成顯示設備環(huán)境或打印設備環(huán)境,然后調(diào)用打印,首先生成顯示設備環(huán)境或打印設備環(huán)境,然后調(diào)用不同設備環(huán)境中的同名函數(shù)實現(xiàn)在不同設備環(huán)境中的同名函數(shù)實現(xiàn)在顯視器顯視器顯示或在打印機顯示或
3、在打印機上打印。而設備環(huán)境根據(jù)選擇的不同設備,調(diào)用各個設備上打印。而設備環(huán)境根據(jù)選擇的不同設備,調(diào)用各個設備制造廠商提供的設備驅(qū)動程序,在制造廠商提供的設備驅(qū)動程序,在顯視器顯視器上顯示或在打印上顯示或在打印機上打印。這些工作都是由機上打印。這些工作都是由GDI+完成的。這樣做的最大好完成的。這樣做的最大好處是應用程序和設備無關,應用程序不必為不同的設備編處是應用程序和設備無關,應用程序不必為不同的設備編制不同的程序。無論是不同的顯卡,還是不同的打印機,制不同的程序。無論是不同的顯卡,還是不同的打印機,只要安裝該設備的驅(qū)動程序,應用程序就可以使用該設備只要安裝該設備的驅(qū)動程序,應用程序就可以使
4、用該設備了,微軟的了,微軟的Word程序可以使用不同的打印機就是使用了這程序可以使用不同的打印機就是使用了這個原理。設備環(huán)境所扮演的角色如圖所示。個原理。設備環(huán)境所扮演的角色如圖所示。 3CRT顯示打印機打印CRT驅(qū)動程序打印機驅(qū)動程序(GDI+)設備環(huán)境應用程序4GDI+GDI+是是對對WindowsWindows操作系統(tǒng)操作系統(tǒng)GDIGDI函數(shù)庫函數(shù)庫(GDI32.DLL)(GDI32.DLL)的擴充,并用的擴充,并用C+C+類進行了封裝,類進行了封裝,GDI+GDI+提供了比提供了比GDIGDI更強大的功能。更強大的功能。WindowsXPWindowsXP及以后版本支持及以后版本支持G
5、DI+GDI+,以前版本,以前版本W(wǎng)indowsWindows操作系統(tǒng)要使用操作系統(tǒng)要使用GDI+GDI+,必,必須復制須復制Gdiplus.dllGdiplus.dll到系統(tǒng)目錄。到系統(tǒng)目錄。GDI+GDI+支持受控代支持受控代碼和非受控代碼。碼和非受控代碼。 55.2 Graphics類類 GraphicsGraphics類提供一些方法繪制各種圖形。類提供一些方法繪制各種圖形。GraphicsGraphics類是類是密封類,不能有派生密封類,不能有派生類。類。 65.2.1 使用使用Graphics類繪圖的基本步驟類繪圖的基本步驟 GDI+ GDI+類提供了一些繪圖工具,例如提供筆用來定義
6、圖形外輪廓類提供了一些繪圖工具,例如提供筆用來定義圖形外輪廓線的顏色及粗細,提供刷子定義添充封閉圖形內(nèi)部的顏色和格線的顏色及粗細,提供刷子定義添充封閉圖形內(nèi)部的顏色和格式,提供不同輸出字體。式,提供不同輸出字體。GraphicsGraphics類中類中提供繪圖函數(shù)使用提供繪圖函數(shù)使用GDI+GDI+類中提供的繪圖工具來輸出字符或繪制圖形。類中提供的繪圖工具來輸出字符或繪制圖形。GDI+GDI+默認繪圖坐默認繪圖坐標以標以窗體用戶區(qū)左上角為原點,窗體用戶區(qū)左上角為原點,x x軸向右為正方向,軸向右為正方向,y y軸向下為軸向下為正方向,單位為像素。正方向,單位為像素。GDI+GDI+定義了三種坐
7、標系統(tǒng),并提供了三定義了三種坐標系統(tǒng),并提供了三種坐標轉(zhuǎn)換的方法種坐標轉(zhuǎn)換的方法Graphics.TransformPoints()Graphics.TransformPoints()。在不同的控。在不同的控件或設備上繪制圖形方法有很大不同,為了在不同的控件或設件或設備上繪制圖形方法有很大不同,為了在不同的控件或設備上用完全相同的代碼完成相同的圖形,繪圖前應首先建立或備上用完全相同的代碼完成相同的圖形,繪圖前應首先建立或得到相應控件或設備關聯(lián)的得到相應控件或設備關聯(lián)的GraphicsGraphics類對象。類對象。下面的例子,在下面的例子,在窗體中增加了一個按鈕,單擊按鈕將在窗體中畫一個邊界為
8、紅窗體中增加了一個按鈕,單擊按鈕將在窗體中畫一個邊界為紅色,內(nèi)部填充為藍色的圓。該程序段說明了使用色,內(nèi)部填充為藍色的圓。該程序段說明了使用GraphicsGraphics類繪類繪圖的基本步驟。按鈕的單擊事件處理函數(shù)如下:圖的基本步驟。按鈕的單擊事件處理函數(shù)如下: 7繪制矩形定義的園或橢圓,矩形左上角坐標為繪制矩形定義的園或橢圓,矩形左上角坐標為(10,10),(10,10),寬和高各寬和高各為為100100個像素單位。個像素單位。private void button1_Click(object sender,EventArgs e)private void button1_Click(ob
9、ject sender,EventArgs e) /得到窗體使用的得到窗體使用的GraphicsGraphics類對象方法類對象方法1 1 Graphics g=this.CreateGraphics(); Graphics g=this.CreateGraphics(); / /創(chuàng)建紅色的筆對象創(chuàng)建紅色的筆對象 Pen pen1=new Pen(Color.Red);Pen pen1=new Pen(Color.Red); / /創(chuàng)建藍色的刷子對象創(chuàng)建藍色的刷子對象 SolidBrush brush1=new SolidBrush(Color.Blue);SolidBrush brush1=
10、new SolidBrush(Color.Blue); / /用紅色筆在窗體中畫矩形內(nèi)切圓的邊界用紅色筆在窗體中畫矩形內(nèi)切圓的邊界 g.DrawEllipse(pen1,10,10,100,100);g.DrawEllipse(pen1,10,10,100,100); / /用藍色刷子填充矩形內(nèi)切圓的內(nèi)部用藍色刷子填充矩形內(nèi)切圓的內(nèi)部 g.FillEllipse(brush1,10,10,100,100); g.FillEllipse(brush1,10,10,100,100); 85.2.2 窗體的窗體的Paint事件事件 運行上例,單擊按鈕,出現(xiàn)邊界為紅色,內(nèi)部填充運行上例,單擊按鈕,出現(xiàn)
11、邊界為紅色,內(nèi)部填充為藍色的圓。最小化后再最大化,圖形消失。這是因為藍色的圓。最小化后再最大化,圖形消失。這是因為當發(fā)生窗體最小化后再最大化、菜單被打開再關閉為當發(fā)生窗體最小化后再最大化、菜單被打開再關閉或打開對話框再關閉等情況,用戶區(qū)內(nèi)容可能被破壞。或打開對話框再關閉等情況,用戶區(qū)內(nèi)容可能被破壞。操作系統(tǒng)不保存被破壞的用戶區(qū)內(nèi)容,而是由應用程操作系統(tǒng)不保存被破壞的用戶區(qū)內(nèi)容,而是由應用程序自己恢復被破壞的用戶區(qū)內(nèi)容。當應用程序窗口用序自己恢復被破壞的用戶區(qū)內(nèi)容。當應用程序窗口用戶區(qū)內(nèi)容被破壞后需恢復時,戶區(qū)內(nèi)容被破壞后需恢復時,WindowsWindows操作系統(tǒng)向應操作系統(tǒng)向應用程序發(fā)送用
12、程序發(fā)送PaintPaint事件,應用程序應把在窗口用戶區(qū)事件,應用程序應把在窗口用戶區(qū)輸出數(shù)據(jù)的語句放在輸出數(shù)據(jù)的語句放在PaintPaint事件處理函數(shù)中,應用程事件處理函數(shù)中,應用程序響應序響應PaintPaint事件,能在事件處理函數(shù)中調(diào)用這些在事件,能在事件處理函數(shù)中調(diào)用這些在窗口用戶區(qū)輸出數(shù)據(jù)的語句恢復被破壞的內(nèi)容。窗口用戶區(qū)輸出數(shù)據(jù)的語句恢復被破壞的內(nèi)容。FormForm類窗體不能自動響應類窗體不能自動響應PaintPaint事件,程序員必須生成事件,程序員必須生成PaintPaint事件處理函數(shù)。修改上例,在事件處理函數(shù)。修改上例,在Form1Form1類中增加類中增加Pain
13、tPaint事件處理函數(shù)如下:事件處理函數(shù)如下: 9private void Form1_Paint(object sender,PaintEventArgs e)private void Form1_Paint(object sender,PaintEventArgs e) /得到窗體的使用的得到窗體的使用的GraphicsGraphics類對象方法類對象方法2 2,方法,方法3 3見見.4節(jié)節(jié) Graphics g=e.Graphics;Graphics g=e.Graphics; Pen pen1=new Pen(Color.Red); Pen pen1=new Pen(
14、Color.Red); SolidBrush brush1=new SolidBrush(Color.Blue); SolidBrush brush1=new SolidBrush(Color.Blue); g.DrawEllipse(pen1,10,10,100,100); g.DrawEllipse(pen1,10,10,100,100); g.FillEllipse(brush1,10,10,100,100); g.FillEllipse(brush1,10,10,100,100); 運行后,出現(xiàn)邊界為紅色,內(nèi)部填充藍色的圓。最小化后,再最運行后,出現(xiàn)邊界為紅色,內(nèi)部填充藍色的圓。最小化
15、后,再最大化,圖形不消失。大化,圖形不消失。 105.3 GDI+中常用的結(jié)構(gòu)中常用的結(jié)構(gòu) 本節(jié)介紹本節(jié)介紹GDI+GDI+中常用的結(jié)構(gòu),包括:中常用的結(jié)構(gòu),包括:PointPoint、PointFPointF、SizeSize、SizeFSizeF、RectangleRectangle、RectangleFRectangleF、ColorColor等。等。它們是在命名空間它們是在命名空間System.DrawingSystem.Drawing中定義的。中定義的。 點結(jié)構(gòu)點結(jié)構(gòu)PointPoint和和PointFPointF定義點的位置。點結(jié)構(gòu)有兩個定義點的位置。點結(jié)構(gòu)有兩個成員:成員:X X
16、,Y Y,表示點的,表示點的x x軸和軸和y y軸的坐標。其常用構(gòu)造軸的坐標。其常用構(gòu)造函數(shù)如下:函數(shù)如下:Point p1=new Point(int X,int Y);/Point p1=new Point(int X,int Y);/X,YX,Y為整數(shù)為整數(shù)PointF p2=new PointF(float X,floa Y);PointF p2=new PointF(float X,floa Y);/X,Y/X,Y為浮點為浮點數(shù)數(shù) 11結(jié)構(gòu)結(jié)構(gòu)SizeSize和和SizeFSizeF用來描述對象寬和高,有成員用來描述對象寬和高,有成員WidthWidth和和HeightHeight。
17、常用構(gòu)造函數(shù)如下:。常用構(gòu)造函數(shù)如下:/坐標系統(tǒng)可以轉(zhuǎn)換,坐標單位可以不是點距坐標系統(tǒng)可以轉(zhuǎn)換,坐標單位可以不是點距Size(int width,int height);Size(int width,int height);/float/float類型是為了支持坐標不是點距的單位類型是為了支持坐標不是點距的單位/(/(例如單位為例如單位為mm)mm)SizeF(float width,float height);SizeF(float width,float height);12矩形結(jié)構(gòu)矩形結(jié)構(gòu)RectangleRectangle和和RectangleFRectangleF用來描述一個矩形,用
18、來描述一個矩形,其常用屬性和方法如下:其常用屬性和方法如下: 屬性屬性X X、Y Y和只讀屬性和只讀屬性LeftLeft、TopTop: 只讀屬性只讀屬性RightRight和和BottomBottom: 屬性屬性WidthWidth、HeightHeight和只讀屬性和只讀屬性SizeSize: 構(gòu)造函數(shù)構(gòu)造函數(shù)Rectangle(Point location,Size size)Rectangle(Point location,Size size): 構(gòu)造函數(shù)構(gòu)造函數(shù)Rectangle(int X,int Y,int width,int Rectangle(int X,int Y,int
19、width,int height)height): 13 Color Color結(jié)構(gòu)用來描述顏色。任何一種顏色可以用透明結(jié)構(gòu)用來描述顏色。任何一種顏色可以用透明度度( (alphaalpha) ),藍色,藍色(bb)(bb),綠色,綠色(gg)(gg),紅色,紅色(rr)(rr)合成,合成,1616進制數(shù)格式為進制數(shù)格式為0 xalrrbbgg0 xalrrbbgg,其中,其中al,bb,gg,rral,bb,gg,rr為為2 2位位1616進制數(shù)進制數(shù)(0-255)(0-255),用這個無符號,用這個無符號3232位數(shù)代表顏色。位數(shù)代表顏色。ColorColor結(jié)構(gòu)常用方法如下:結(jié)構(gòu)常用方法
20、如下: public static Color FromArgbpublic static Color FromArgb(int alpha,int rr,int gg,int bb)(int alpha,int rr,int gg,int bb): public static Color FromArgbpublic static Color FromArgb(int rr,int gg,int bb)(int rr,int gg,int bb): public static Color FromArgbpublic static Color FromArgb(int alpha,Color
21、 color)(int alpha,Color color):【例例5.15.1】本例創(chuàng)建本例創(chuàng)建3 3個半透明的紅、綠、藍刷子,填個半透明的紅、綠、藍刷子,填充充3 3個矩形,請注意例子中透明度及顏色使用的方法。個矩形,請注意例子中透明度及顏色使用的方法。 14private void Form1_Paintprivate void Form1_Paint(object sender,PaintEventArgs e)(object sender,PaintEventArgs e) Graphics g=e.Graphics;Graphics g=e.Graphics; SolidBrush
22、 RedBrush=new SolidBrush SolidBrush RedBrush=new SolidBrush(Color.FromArgb(128,255,0,0);(Color.FromArgb(128,255,0,0); /半透明半透明SolidBrush GreenBrush=new SolidBrush GreenBrush=new SolidBrush(Color.FromArgb(128,0,255,0);SolidBrush(Color.FromArgb(128,0,255,0);SolidBrush BlueBrush=newSolidBrush BlueBrush=
23、new SolidBrush(Color.FromArgb(128,0,0,255); SolidBrush(Color.FromArgb(128,0,0,255);g.FillRectangle(RedBrush,0,0,80,80);g.FillRectangle(RedBrush,0,0,80,80);g.FillRectangle(GreenBrush,40,0,80,80);g.FillRectangle(GreenBrush,40,0,80,80); g.FillRectangle(BlueBrush,20,20,80,80); g.FillRectangle(BlueBrush,
24、20,20,80,80); 15效果如圖,可以將透明度效果如圖,可以將透明度alphaalpha值設為值設為255255,再運行一次,再運行一次,看看看看有何不同。有何不同。C#C#中還預定義了一些顏色常數(shù),例如黑色為中還預定義了一些顏色常數(shù),例如黑色為Color.BlackColor.Black,紅色為,紅色為Color.RedColor.Red等等,等等,請用請用VS2005VS2005幫助系統(tǒng)查幫助系統(tǒng)查看看。 165.4 5.4 畫筆畫筆Pen類類 PenPen類對象指定繪制圖形的外輪廓線寬度和顏色。類對象指定繪制圖形的外輪廓線寬度和顏色。PenPen類有類有4 4個構(gòu)造函數(shù),分別是:
25、個構(gòu)造函數(shù),分別是: public Pen(Color color);public Pen(Color color); public Pen(Color colorpublic Pen(Color color,float width);float width); public Pen(Brush brush);public Pen(Brush brush); public Pen(Brush,float width);public Pen(Brush,float width); 【例例5.25.2】PenPen類常用的屬性:類常用的屬性:ColorColor為筆的顏色,為筆的顏色,WidthW
26、idth為筆的寬度,為筆的寬度,DashStyleDashStyle為筆的樣式,為筆的樣式,EndCapEndCap和和StartCapStartCap為線段終點和起點的外觀。下為線段終點和起點的外觀。下例顯示各種筆的屬性例顯示各種筆的屬性DashStyleDashStyle、EndCapEndCap和和StartCapStartCap不同選項的樣式。主窗體不同選項的樣式。主窗體PaintPaint事件處理事件處理函數(shù)如下,運行效果如圖。函數(shù)如下,運行效果如圖。 1718private void Form1_Paint(object sender,PaintEventArgs e)privat
27、e void Form1_Paint(object sender,PaintEventArgs e) Graphics g=e.Graphics;Graphics g=e.Graphics; Pen pen1=new Pen(Color.Red,6); / Pen pen1=new Pen(Color.Red,6); /默認為實線筆默認為實線筆 /從點從點(10,10)(10,10)到點到點(100(100,100)100)的實線,圖中左邊第的實線,圖中左邊第1 1條線條線 g.DrawLine(pen1,10,10,100,10); pen1.DashStyle=g.DrawLine(pen
28、1,10,10,100,10); pen1.DashStyle= System.Drawing.Drawing2D.DashStyle.Dash; / System.Drawing.Drawing2D.DashStyle.Dash; /虛線筆虛線筆 g.DrawLine(pen1,10,20,100,20);/g.DrawLine(pen1,10,20,100,20);/畫虛線圖中左邊第畫虛線圖中左邊第2 2條線條線 /點短線風格的線點短線風格的線 pen1.DashStyle=pen1.DashStyle= System.Drawing.Drawing2D.DashStyle.DashDot
29、; System.Drawing.Drawing2D.DashStyle.DashDot; g.DrawLine(pen1,10,30,100,30); / g.DrawLine(pen1,10,30,100,30); /圖中左邊第圖中左邊第3 3條線條線 /下條語句設置雙點,短線風格的線風格下條語句設置雙點,短線風格的線風格 pen1.DashStyle=pen1.DashStyle= System.Drawing.Drawing2D.DashStyle.DashDotDot; System.Drawing.Drawing2D.DashStyle.DashDotDot; g.DrawLine
30、(pen1,10,40,100,40); / g.DrawLine(pen1,10,40,100,40); /圖中左邊第圖中左邊第4 4條線條線 19pen1.DashStyle=pen1.DashStyle=/由點組成的線由點組成的線System.Drawing.Drawing2D.DashStyle.Dot; System.Drawing.Drawing2D.DashStyle.Dot; g.DrawLine(pen1,10,50,100,50);/g.DrawLine(pen1,10,50,100,50);/圖中左邊第圖中左邊第5 5條線條線pen1.DashStyle=pen1.Das
31、hStyle=/恢復實線筆恢復實線筆System.Drawing.Drawing2D.DashStyle.Solid; System.Drawing.Drawing2D.DashStyle.Solid; pen1.EndCap=pen1.EndCap= / /后箭頭后箭頭 System.Drawing.Drawing2D.LineCap.ArrowAnchor;System.Drawing.Drawing2D.LineCap.ArrowAnchor;g.DrawLine(pen1,150,10,250,10);/g.DrawLine(pen1,150,10,250,10);/圖中右邊第圖中右邊
32、第1 1條線條線pen1.StartCap=pen1.StartCap= / /前箭頭前箭頭 System.Drawing.Drawing2D.LineCap.ArrowAnchor;System.Drawing.Drawing2D.LineCap.ArrowAnchor;g.DrawLine(pen1,150,22,250,22); /g.DrawLine(pen1,150,22,250,22); /圖中右邊第圖中右邊第2 2條線條線pen1.EndCap=pen1.EndCap= System.Drawing.Drawing2D.LineCap.RoundAnchor; System.Dr
33、awing.Drawing2D.LineCap.RoundAnchor;g.DrawLine(pen1,150,34,250,34); /g.DrawLine(pen1,150,34,250,34); /圖中右邊第圖中右邊第3 3條線條線20pen1.EndCap=pen1.EndCap= System.Drawing.Drawing2D.LineCap.SquareAnchor; System.Drawing.Drawing2D.LineCap.SquareAnchor;g.DrawLine(pen1,150,46,250,46); g.DrawLine(pen1,150,46,250,46
34、); /圖中右邊第圖中右邊第4 4條線條線pen1.EndCap=System.Drawing.Drawing2D.LineCap.Triangle;pen1.EndCap=System.Drawing.Drawing2D.LineCap.Triangle;g.DrawLine(pen1,150,58,250,58); g.DrawLine(pen1,150,58,250,58); /圖中右邊第圖中右邊第5 5條線條線pen1.EndCap=pen1.EndCap= System.Drawing.Drawing2D.LineCap.DiamondAnchor; System.Drawing.D
35、rawing2D.LineCap.DiamondAnchor;g.DrawLine(pen1,150,70,250,70);g.DrawLine(pen1,150,70,250,70);/圖中右邊第圖中右邊第6 6條線條線 215.5 5.5 創(chuàng)建畫刷創(chuàng)建畫刷 畫刷類對象指定填充封閉圖形內(nèi)部的顏色和樣式,封畫刷類對象指定填充封閉圖形內(nèi)部的顏色和樣式,封閉圖形包括矩形、橢圓、扇形、多邊形和任意封閉圖閉圖形包括矩形、橢圓、扇形、多邊形和任意封閉圖形。形。GDI+GDI+系統(tǒng)提供了幾個預定義畫刷類,包括:系統(tǒng)提供了幾個預定義畫刷類,包括: SolidBrushSolidBrush:單色畫刷,在命名空
36、間:單色畫刷,在命名空間System.DrawingSystem.Drawing中定義。中定義。 HatchBrushHatchBrush:陰影畫刷,后:陰影畫刷,后4 4個畫刷在命名空間個畫刷在命名空間System.Drawing.Drawing2DSystem.Drawing.Drawing2D中定義。中定義。 TextureBrushTextureBrush:紋理:紋理( (圖像圖像) )畫刷。畫刷。 LinearGradientBrushLinearGradientBrush:兩個顏色或多個顏色線性漸:兩個顏色或多個顏色線性漸變畫刷。變畫刷。 PathGradientBrushPath
37、GradientBrush:使用路徑定義刷子形狀的復雜:使用路徑定義刷子形狀的復雜漸變畫刷。漸變畫刷。 225.5.1 單色畫刷單色畫刷SolidBrush 前邊已使用過單色畫刷前邊已使用過單色畫刷。其構(gòu)造函數(shù)只有其構(gòu)造函數(shù)只有1 1個,定義個,定義如下:如下:/建立指定顏色的畫刷建立指定顏色的畫刷SolidBrush brush1SolidBrush brush1=new S=new SolidBrush(Color color); olidBrush(Color color); 可以使用屬性可以使用屬性ColorColor來修改畫刷顏色,例如:來修改畫刷顏色,例如:brush1.Color
38、=Color.Green;brush1.Color=Color.Green; 235.5.2 陰影畫刷陰影畫刷HatchBrush 陰影畫刷是指定樣式陰影畫刷是指定樣式( (例如,多條橫線、多條豎線、多例如,多條橫線、多條豎線、多條斜線等條斜線等) )、指定填充線條的顏色和指定背景顏色的、指定填充線條的顏色和指定背景顏色的畫刷,陰影畫刷畫刷,陰影畫刷常用屬性和方法如下:常用屬性和方法如下: 屬性屬性backgroundColorbackgroundColor:畫刷背景顏色。:畫刷背景顏色。 屬性屬性foreColorforeColor:畫刷填充線條的顏色。:畫刷填充線條的顏色。 屬性屬性Hat
39、chStyleHatchStyle:該屬性是只讀的,不能修改,表:該屬性是只讀的,不能修改,表示畫刷的不同樣式。示畫刷的不同樣式。 構(gòu)造函數(shù)構(gòu)造函數(shù)HatchBrush(HatchStyle h,Color c)HatchBrush(HatchStyle h,Color c):參:參數(shù)數(shù)1 1指定樣式,參數(shù)指定樣式,參數(shù)2 2指定填充線條的顏色,背景色指定填充線條的顏色,背景色被初始化為黑色。被初始化為黑色。 構(gòu)造函數(shù)構(gòu)造函數(shù)HatchBrush(HatchStyle h,Color c1HatchBrush(HatchStyle h,Color c1,Color c2)Color c2):參
40、數(shù):參數(shù)1 1指定樣式,參數(shù)指定樣式,參數(shù)2 2指定填充線條的指定填充線條的顏色,參數(shù)顏色,參數(shù)3 3指定背景色。指定背景色。 24【例例5.35.3】例子顯示了屬性例子顯示了屬性HatchStyleHatchStyle為不同值時陰影畫刷的不為不同值時陰影畫刷的不同樣式。在同樣式。在Form1.csForm1.cs文件頭部增加語句文件頭部增加語句using using System.Drawing.Drawing2DSystem.Drawing.Drawing2D,窗體,窗體PaintPaint事件處理函數(shù)如下:事件處理函數(shù)如下: private void Form1_Paint(object
41、 sender,PaintEventArgs e)private void Form1_Paint(object sender,PaintEventArgs e) Graphics g=e.Graphics; /Graphics g=e.Graphics; /得到窗體使用的得到窗體使用的GraphicsGraphics類對象類對象 HatchBrush b1=newHatchBrush b1=newHatchBrush(HatchStyle.BackwardDiagonal,HatchBrush(HatchStyle.BackwardDiagonal, Color.Blue,Color.Lig
42、htGray); Color.Blue,Color.LightGray); / /矩形被填充左斜線,下圖窗體中第矩形被填充左斜線,下圖窗體中第1 1圖圖 g.FillRectangle(b1,10,10,50,50); g.FillRectangle(b1,10,10,50,50); HatchBrush b2=new HatchBrush HatchBrush b2=new HatchBrush (HatchStyle.Cross,Color.Blue,Color.LightGray); (HatchStyle.Cross,Color.Blue,Color.LightGray); g.Fil
43、lRectangle(b2,70,10,50,50);/ g.FillRectangle(b2,70,10,50,50);/矩形被填充方格矩形被填充方格, ,第第2 2圖圖 HatchBrush b2=new HatchBrush(HatchStyle.Cross,HatchBrush b2=new HatchBrush(HatchStyle.Cross,Color.Blue,Color.LightGray);Color.Blue,Color.LightGray);25g.FillRectangle(b2,70,10,50,50);g.FillRectangle(b2,70,10,50,50)
44、;/矩形被填充方格,第矩形被填充方格,第2 2圖圖HatchBrush b3=new HatchBrush(HatchStyle.ForwardDiagonal,HatchBrush b3=new HatchBrush(HatchStyle.ForwardDiagonal,Color.Blue,Color.LightGray);Color.Blue,Color.LightGray);g.FillRectangle(b3,130,10,50,50);g.FillRectangle(b3,130,10,50,50);/矩形被填充右斜線,第矩形被填充右斜線,第3 3圖圖HatchBrush b4=n
45、ew HatchBrush b4=new HatchBrush(HatchStyle.DiagonalCross,HatchBrush(HatchStyle.DiagonalCross,Color.Blue,Color.LightGray);Color.Blue,Color.LightGray);g.FillRectangle(b4,190,10,50,50);g.FillRectangle(b4,190,10,50,50);/矩形被填充菱形,第矩形被填充菱形,第4 4圖圖HatchBrush b5=HatchBrush b5=new HatchBrush(HatchStyle.Vertica
46、l,new HatchBrush(HatchStyle.Vertical,Color.Blue,Color.LightGray);Color.Blue,Color.LightGray);g.FillRectangle(b5,250,10,50,50);g.FillRectangle(b5,250,10,50,50);/矩形被填充豎線,第矩形被填充豎線,第5 5圖圖HatchBrush b6=new HatchBrush b6=new HatchBrush(HatchStyle.Horizontal,HatchBrush(HatchStyle.Horizontal,Color.Blue,Colo
47、r.LightGray);Color.Blue,Color.LightGray);g.FillRectangle(b6,310,10,50,50);g.FillRectangle(b6,310,10,50,50);/矩形被填充橫線,第矩形被填充橫線,第6 6圖圖 / /運行效果如圖運行效果如圖 26275.5.3 5.5.3 紋理紋理(圖像圖像)畫刷畫刷TextureBrush 紋理紋理( (圖像圖像) )畫刷使用圖像填充封閉曲線的內(nèi)部,有畫刷使用圖像填充封閉曲線的內(nèi)部,有8 8個構(gòu)造函數(shù),最簡單的構(gòu)造函數(shù)如下,參數(shù)為畫刷個構(gòu)造函數(shù),最簡單的構(gòu)造函數(shù)如下,參數(shù)為畫刷使用的位圖類對象,其余請讀者
48、使用使用的位圖類對象,其余請讀者使用MSDNMSDN或或VS2005VS2005幫助幫助系統(tǒng)系統(tǒng)查看。查看。TextureBrush(Image bitmap); TextureBrush(Image bitmap); 【例例5.45.4】例子使用位圖文件例子使用位圖文件n2k.bmpn2k.bmp建立位圖類對象建立位圖類對象作為畫刷的圖案,在作為畫刷的圖案,在Form1.csForm1.cs文件的頭部增加語句文件的頭部增加語句using System.Drawing.Drawing2Dusing System.Drawing.Drawing2D,窗體,窗體PaintPaint事件事件處理函數(shù)
49、如下:處理函數(shù)如下: n2k.bmpn2k.bmp是是Windows2000Windows2000操作系統(tǒng)中的一個位圖文件,操作系統(tǒng)中的一個位圖文件,應用程序運行效果如圖。應用程序運行效果如圖。 2829private void Form1_Paint(object sender,PaintEventArgs e)private void Form1_Paint(object sender,PaintEventArgs e) Graphics g=e.Graphics;/Graphics g=e.Graphics;/得到窗體使用的得到窗體使用的GraphicsGraphics類對象類對象Pen
50、 pen1=new Pen(Color.Red);Pen pen1=new Pen(Color.Red); / /建立位圖類對象見建立位圖類對象見5.105.10節(jié)節(jié)Bitmap b1=new Bitmap(C:WINNTsystem32n2k.bmp);Bitmap b1=new Bitmap(C:WINNTsystem32n2k.bmp);TextureBrush b1=new TextureBrush(b1);TextureBrush b1=new TextureBrush(b1);g.FillRectangle(b1,10,10,200,100);g.FillRectangle(b1,
51、10,10,200,100);g.DrawRectangle(pen1,10,10,200,100);g.DrawRectangle(pen1,10,10,200,100); 305.5.4顏色漸變畫刷顏色漸變畫刷LinearGradientBrush 5.5.5畫刷畫刷PathGradientBrush和和GraphicsPath類類 自學自學315.6 基本圖形的繪制和填充基本圖形的繪制和填充 GraphicsGraphics類提供了一些方法,用來繪制或填充各類提供了一些方法,用來繪制或填充各種圖形。本節(jié)介紹這些方法。種圖形。本節(jié)介紹這些方法。 325.6.1 用用DrawLine方法繪制
52、線段方法繪制線段 繪制線段方法定義如下:繪制線段方法定義如下: void DrawLine(Pen pen,int x1,int y1,int void DrawLine(Pen pen,int x1,int y1,int x2,int y2)x2,int y2): DrawLine(Pen pen,Point p1,Point p2)DrawLine(Pen pen,Point p1,Point p2): public void DrawLines(Pen pen,Point public void DrawLines(Pen pen,Point points)points): 【例例5.7
53、5.7】使用使用DrawLine()DrawLine()的例子,為主窗體的例子,為主窗體PaintPaint事件增加事件處理函數(shù)如下:事件增加事件處理函數(shù)如下: 33private void Form1_Paintprivate void Form1_Paint(object sender,PaintEventArgs e)(object sender,PaintEventArgs e) Graphics g=e.Graphics;Graphics g=e.Graphics; Pen pen1=new Pen(Color.Red); Pen pen1=new Pen(Color.Red);/用
54、筆用筆pen1pen1從點從點(30,30)(30,30)到到(100,100)(100,100)畫直線畫直線 g.DrawLine(pen1,30,30,100,100); g.DrawLine(pen1,30,30,100,100); Point p1=new Point(30,40); Point p1=new Point(30,40); Point p2=new Point(100,110); Point p2=new Point(100,110); / /用筆用筆pen1pen1從點從點(30,40)(30,40)到到(100,110)(100,110)畫直線畫直線 g.DrawLi
55、ne(pen1,p1,p2); g.DrawLine(pen1,p1,p2); 34【例例5.85.8】使用繪制線段函數(shù)畫任意曲線使用繪制線段函數(shù)畫任意曲線( (畫正弦曲線,注意如何畫正弦曲線,注意如何使用數(shù)學函數(shù)使用數(shù)學函數(shù)) )。private void Form1_Paint(object sender,PaintEventArgs e)private void Form1_Paint(object sender,PaintEventArgs e) /得到窗體的使用的得到窗體的使用的GraphicsGraphics類對象類對象 Graphics g=this.CreateGraphics
56、(); Graphics g=this.CreateGraphics(); Pen pen1=new Pen(Color.Red); Pen pen1=new Pen(Color.Red); float y=50,y1,x1,x2; float y=50,y1,x1,x2; for(int x=0;x720;x+) / for(int x=0;x720;x+) /畫畫2 2個周期正弦曲線個周期正弦曲線 x1=(float)x;x1=(float)x;x2=(float)(x+1);x2=(float)(x+1);y1=(float)(50+50y1=(float)(50+50* *Math.S
57、in(3.14159/180.0)Math.Sin(3.14159/180.0)* *(x+1);(x+1);g.DrawLine(pen1,x1,y,x2,y1);g.DrawLine(pen1,x1,y,x2,y1);y=y1;y=y1; / /運行,在窗體中可以看到一條紅色正弦曲線如圖運行,在窗體中可以看到一條紅色正弦曲線如圖3536【例例5.95.9】在在WindowsWindows畫圖程序中,可以拖動鼠標畫任畫圖程序中,可以拖動鼠標畫任意曲線。本例實現(xiàn)意曲線。本例實現(xiàn)用拖動鼠標左鍵在主窗體中畫曲用拖動鼠標左鍵在主窗體中畫曲線。每條曲線都是由若干很短的線段組成。鼠標左線。每條曲線都是由
58、若干很短的線段組成。鼠標左鍵在按下狀態(tài),移動鼠標,每次移動很短距離,畫鍵在按下狀態(tài),移動鼠標,每次移動很短距離,畫出這段線段,所有這些線段組合起來,形成一條曲出這段線段,所有這些線段組合起來,形成一條曲線。線。 1.1. 新建項目。在新建項目。在Form1Form1類中增加兩個私有變量類中增加兩個私有變量: : /表示鼠標左鍵是否按下,如按下鼠標再移動將畫曲線表示鼠標左鍵是否按下,如按下鼠標再移動將畫曲線private bool mark=false;private bool mark=false;/記錄畫下一條很短線段的起始點記錄畫下一條很短線段的起始點 private Point poin
59、t;private Point point;2.2. 為主窗體的事件為主窗體的事件OnMouseDownOnMouseDown,OnMouseUpOnMouseUp,OnMouseMoveOnMouseMove增加事件處理函數(shù)如下:增加事件處理函數(shù)如下: 37 private void Form1_MouseDown private void Form1_MouseDown(object sender,MouseEventArgs e)(object sender,MouseEventArgs e) if(e.Button=MouseButtons.Left)if(e.Button=Mouse
60、Buttons.Left) /如果鼠標左鍵按下如果鼠標左鍵按下 /記錄曲線的第一個點的坐標,為記錄曲線的第一個點的坐標,為畫線段的起始點畫線段的起始點 point.X=e.X; point.X=e.X; point.Y=e.Y; point.Y=e.Y; mark=true; mark=true;/表示鼠標左鍵已按下,鼠標如果再移動,將畫曲線表示鼠標左鍵已按下,鼠標如果再移動,將畫曲線 private void Form1_MouseMove private void Form1_MouseMove(object sender,MouseEventArgs e)(object sender,M
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年膜片式液壓排泥閥項目可行性研究報告
- 2025至2031年中國紙顯液行業(yè)投資前景及策略咨詢研究報告
- 惠州廣東惠州市120急救指揮中心招聘聘用人員筆試歷年參考題庫附帶答案詳解
- 2025年曬圖紙項目可行性研究報告
- 2025至2031年中國多功能專用防水粘合劑行業(yè)投資前景及策略咨詢研究報告
- 2025年復合輪套項目可行性研究報告
- 2025至2031年中國低壓開關板行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國DCS系統(tǒng)專用顯示器行業(yè)投資前景及策略咨詢研究報告
- 2025至2030年鳥用品項目投資價值分析報告
- 2025至2030年鋁手電筒項目投資價值分析報告
- 風險分級管控措施清單(路面工程)
- 最新醫(yī)療安全知識培訓課件
- 財務管理法律風險防范課件
- 管理學原理(南大馬工程)
- 人事檔案辦理委托書模板
- 地埋管地源熱泵系統(tǒng)巖土熱響應試驗、地埋管外徑及壁厚、巖土體熱物性參數(shù)
- 初中生物 七年級 《植物體的結(jié)構(gòu)層次》 教學設計
- 31863:2015企業(yè)履約能力達標全套管理制度
- 蘇教版數(shù)學二年級下冊《認識時分》教案(無錫公開課)
- 即興口語(姜燕)-課件-即興口語第四章PPT-中國傳媒大學
- 報批稿20160301-浙江嘉化能源化工股份有限公司年產(chǎn)16萬噸多品種脂肪醇(酸)產(chǎn)品項目
評論
0/150
提交評論