版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1第五章第五章 圖形圖像編程圖形圖像編程 本章的目的是學(xué)習(xí)使用本章的目的是學(xué)習(xí)使用GDI+的圖形圖像編程方的圖形圖像編程方法,希望在學(xué)習(xí)本章以后,能編制像法,希望在學(xué)習(xí)本章以后,能編制像Windows畫圖畫圖那樣的程序。本章的重點(diǎn)是學(xué)習(xí)創(chuàng)建畫筆、畫刷那樣的程序。本章的重點(diǎn)是學(xué)習(xí)創(chuàng)建畫筆、畫刷等繪圖工具,學(xué)習(xí)使用等繪圖工具,學(xué)習(xí)使用Graphics類的繪圖函數(shù)繪制類的繪圖函數(shù)繪制各種圖形,學(xué)習(xí)利用各種圖形,學(xué)習(xí)利用Bitmap類處理圖形和圖像,類處理圖形和圖像,最后簡單介紹多媒體和最后簡單介紹多媒體和3D圖形程序設(shè)計(jì)的基礎(chǔ)知圖形程序設(shè)計(jì)的基礎(chǔ)知識。識。 25.1 5.1 GDI+(圖形設(shè)備環(huán)境接
2、口圖形設(shè)備環(huán)境接口) GDI+是是2D(2維維)圖形庫,它允許程序員用庫中的函數(shù)編寫圖形庫,它允許程序員用庫中的函數(shù)編寫與顯視器、打印機(jī)和文件等圖形設(shè)備進(jìn)行交互的與顯視器、打印機(jī)和文件等圖形設(shè)備進(jìn)行交互的Windows和和Web應(yīng)用程序應(yīng)用程序,可以在這些設(shè)備上輸出字符和可以在這些設(shè)備上輸出字符和2D圖形。圖形。Windows和和Web應(yīng)用程序應(yīng)用程序根據(jù)是在根據(jù)是在CRT顯示還是在打印機(jī)顯示還是在打印機(jī)打印,首先生成顯示設(shè)備環(huán)境或打印設(shè)備環(huán)境,然后調(diào)用打印,首先生成顯示設(shè)備環(huán)境或打印設(shè)備環(huán)境,然后調(diào)用不同設(shè)備環(huán)境中的同名函數(shù)實(shí)現(xiàn)在不同設(shè)備環(huán)境中的同名函數(shù)實(shí)現(xiàn)在顯視器顯視器顯示或在打印機(jī)顯示或
3、在打印機(jī)上打印。而設(shè)備環(huán)境根據(jù)選擇的不同設(shè)備,調(diào)用各個(gè)設(shè)備上打印。而設(shè)備環(huán)境根據(jù)選擇的不同設(shè)備,調(diào)用各個(gè)設(shè)備制造廠商提供的設(shè)備驅(qū)動程序,在制造廠商提供的設(shè)備驅(qū)動程序,在顯視器顯視器上顯示或在打印上顯示或在打印機(jī)上打印。這些工作都是由機(jī)上打印。這些工作都是由GDI+完成的。這樣做的最大好完成的。這樣做的最大好處是應(yīng)用程序和設(shè)備無關(guān),應(yīng)用程序不必為不同的設(shè)備編處是應(yīng)用程序和設(shè)備無關(guān),應(yīng)用程序不必為不同的設(shè)備編制不同的程序。無論是不同的顯卡,還是不同的打印機(jī),制不同的程序。無論是不同的顯卡,還是不同的打印機(jī),只要安裝該設(shè)備的驅(qū)動程序,應(yīng)用程序就可以使用該設(shè)備只要安裝該設(shè)備的驅(qū)動程序,應(yīng)用程序就可以使
4、用該設(shè)備了,微軟的了,微軟的Word程序可以使用不同的打印機(jī)就是使用了這程序可以使用不同的打印機(jī)就是使用了這個(gè)原理。設(shè)備環(huán)境所扮演的角色如圖所示。個(gè)原理。設(shè)備環(huán)境所扮演的角色如圖所示。 3CRT顯示打印機(jī)打印CRT驅(qū)動程序打印機(jī)驅(qū)動程序(GDI+)設(shè)備環(huán)境應(yīng)用程序4GDI+GDI+是是對對WindowsWindows操作系統(tǒng)操作系統(tǒng)GDIGDI函數(shù)庫函數(shù)庫(GDI32.DLL)(GDI32.DLL)的擴(kuò)充,并用的擴(kuò)充,并用C+C+類進(jìn)行了封裝,類進(jìn)行了封裝,GDI+GDI+提供了比提供了比GDIGDI更強(qiáng)大的功能。更強(qiáng)大的功能。WindowsXPWindowsXP及以后版本支持及以后版本支持G
5、DI+GDI+,以前版本,以前版本W(wǎng)indowsWindows操作系統(tǒng)要使用操作系統(tǒng)要使用GDI+GDI+,必,必須復(fù)制須復(fù)制Gdiplus.dllGdiplus.dll到系統(tǒng)目錄。到系統(tǒng)目錄。GDI+GDI+支持受控代支持受控代碼和非受控代碼。碼和非受控代碼。 55.2 Graphics類類 GraphicsGraphics類提供一些方法繪制各種圖形。類提供一些方法繪制各種圖形。GraphicsGraphics類是類是密封類,不能有派生密封類,不能有派生類。類。 65.2.1 使用使用Graphics類繪圖的基本步驟類繪圖的基本步驟 GDI+ GDI+類提供了一些繪圖工具,例如提供筆用來定義
6、圖形外輪廓類提供了一些繪圖工具,例如提供筆用來定義圖形外輪廓線的顏色及粗細(xì),提供刷子定義添充封閉圖形內(nèi)部的顏色和格線的顏色及粗細(xì),提供刷子定義添充封閉圖形內(nèi)部的顏色和格式,提供不同輸出字體。式,提供不同輸出字體。GraphicsGraphics類中類中提供繪圖函數(shù)使用提供繪圖函數(shù)使用GDI+GDI+類中提供的繪圖工具來輸出字符或繪制圖形。類中提供的繪圖工具來輸出字符或繪制圖形。GDI+GDI+默認(rèn)繪圖坐默認(rèn)繪圖坐標(biāo)以標(biāo)以窗體用戶區(qū)左上角為原點(diǎn),窗體用戶區(qū)左上角為原點(diǎn),x x軸向右為正方向,軸向右為正方向,y y軸向下為軸向下為正方向,單位為像素。正方向,單位為像素。GDI+GDI+定義了三種坐
7、標(biāo)系統(tǒng),并提供了三定義了三種坐標(biāo)系統(tǒng),并提供了三種坐標(biāo)轉(zhuǎn)換的方法種坐標(biāo)轉(zhuǎn)換的方法Graphics.TransformPoints()Graphics.TransformPoints()。在不同的控。在不同的控件或設(shè)備上繪制圖形方法有很大不同,為了在不同的控件或設(shè)件或設(shè)備上繪制圖形方法有很大不同,為了在不同的控件或設(shè)備上用完全相同的代碼完成相同的圖形,繪圖前應(yīng)首先建立或備上用完全相同的代碼完成相同的圖形,繪圖前應(yīng)首先建立或得到相應(yīng)控件或設(shè)備關(guān)聯(lián)的得到相應(yīng)控件或設(shè)備關(guān)聯(lián)的GraphicsGraphics類對象。類對象。下面的例子,在下面的例子,在窗體中增加了一個(gè)按鈕,單擊按鈕將在窗體中畫一個(gè)邊界為
8、紅窗體中增加了一個(gè)按鈕,單擊按鈕將在窗體中畫一個(gè)邊界為紅色,內(nèi)部填充為藍(lán)色的圓。該程序段說明了使用色,內(nèi)部填充為藍(lán)色的圓。該程序段說明了使用GraphicsGraphics類繪類繪圖的基本步驟。按鈕的單擊事件處理函數(shù)如下:圖的基本步驟。按鈕的單擊事件處理函數(shù)如下: 7繪制矩形定義的園或橢圓,矩形左上角坐標(biāo)為繪制矩形定義的園或橢圓,矩形左上角坐標(biāo)為(10,10),(10,10),寬和高各寬和高各為為100100個(gè)像素單位。個(gè)像素單位。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)建藍(lán)色的刷子對象創(chuàng)建藍(lán)色的刷子對象 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); / /用藍(lán)色刷子填充矩形內(nèi)切圓的內(nèi)部用藍(lán)色刷子填充矩形內(nèi)切圓的內(nèi)部 g.FillEllipse(brush1,10,10,100,100); g.FillEllipse(brush1,10,10,100,100); 85.2.2 窗體的窗體的Paint事件事件 運(yùn)行上例,單擊按鈕,出現(xiàn)邊界為紅色,內(nèi)部填充運(yùn)行上例,單擊按鈕,出現(xiàn)
11、邊界為紅色,內(nèi)部填充為藍(lán)色的圓。最小化后再最大化,圖形消失。這是因?yàn)樗{(lán)色的圓。最小化后再最大化,圖形消失。這是因?yàn)楫?dāng)發(fā)生窗體最小化后再最大化、菜單被打開再關(guān)閉為當(dāng)發(fā)生窗體最小化后再最大化、菜單被打開再關(guān)閉或打開對話框再關(guān)閉等情況,用戶區(qū)內(nèi)容可能被破壞?;虼蜷_對話框再關(guān)閉等情況,用戶區(qū)內(nèi)容可能被破壞。操作系統(tǒng)不保存被破壞的用戶區(qū)內(nèi)容,而是由應(yīng)用程操作系統(tǒng)不保存被破壞的用戶區(qū)內(nèi)容,而是由應(yīng)用程序自己恢復(fù)被破壞的用戶區(qū)內(nèi)容。當(dāng)應(yīng)用程序窗口用序自己恢復(fù)被破壞的用戶區(qū)內(nèi)容。當(dāng)應(yīng)用程序窗口用戶區(qū)內(nèi)容被破壞后需恢復(fù)時(shí),戶區(qū)內(nèi)容被破壞后需恢復(fù)時(shí),WindowsWindows操作系統(tǒng)向應(yīng)操作系統(tǒng)向應(yīng)用程序發(fā)送用
12、程序發(fā)送PaintPaint事件,應(yīng)用程序應(yīng)把在窗口用戶區(qū)事件,應(yīng)用程序應(yīng)把在窗口用戶區(qū)輸出數(shù)據(jù)的語句放在輸出數(shù)據(jù)的語句放在PaintPaint事件處理函數(shù)中,應(yīng)用程事件處理函數(shù)中,應(yīng)用程序響應(yīng)序響應(yīng)PaintPaint事件,能在事件處理函數(shù)中調(diào)用這些在事件,能在事件處理函數(shù)中調(diào)用這些在窗口用戶區(qū)輸出數(shù)據(jù)的語句恢復(fù)被破壞的內(nèi)容。窗口用戶區(qū)輸出數(shù)據(jù)的語句恢復(fù)被破壞的內(nèi)容。FormForm類窗體不能自動響應(yīng)類窗體不能自動響應(yīng)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); 運(yùn)行后,出現(xiàn)邊界為紅色,內(nèi)部填充藍(lán)色的圓。最小化后,再最運(yùn)行后,出現(xiàn)邊界為紅色,內(nèi)部填充藍(lán)色的圓。最小化
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中定義的。中定義的。 點(diǎn)結(jié)構(gòu)點(diǎn)結(jié)構(gòu)PointPoint和和PointFPointF定義點(diǎn)的位置。點(diǎn)結(jié)構(gòu)有兩個(gè)定義點(diǎn)的位置。點(diǎn)結(jié)構(gòu)有兩個(gè)成員:成員:X X
16、,Y Y,表示點(diǎn)的,表示點(diǎn)的x x軸和軸和y y軸的坐標(biāo)。其常用構(gòu)造軸的坐標(biāo)。其常用構(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為浮點(diǎn)為浮點(diǎn)數(shù)數(shù) 11結(jié)構(gòu)結(jié)構(gòu)SizeSize和和SizeFSizeF用來描述對象寬和高,有成員用來描述對象寬和高,有成員WidthWidth和和HeightHeight。
17、常用構(gòu)造函數(shù)如下:。常用構(gòu)造函數(shù)如下:/坐標(biāo)系統(tǒng)可以轉(zhuǎn)換,坐標(biāo)單位可以不是點(diǎn)距坐標(biāo)系統(tǒng)可以轉(zhuǎn)換,坐標(biāo)單位可以不是點(diǎn)距Size(int width,int height);Size(int width,int height);/float/float類型是為了支持坐標(biāo)不是點(diǎn)距的單位類型是為了支持坐標(biāo)不是點(diǎn)距的單位/(/(例如單位為例如單位為mm)mm)SizeF(float width,float height);SizeF(float width,float height);12矩形結(jié)構(gòu)矩形結(jié)構(gòu)RectangleRectangle和和RectangleFRectangleF用來描述一個(gè)矩形,用
18、來描述一個(gè)矩形,其常用屬性和方法如下:其常用屬性和方法如下: 屬性屬性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) ),藍(lán)色,藍(lán)色(bb)(bb),綠色,綠色(gg)(gg),紅色,紅色(rr)(rr)合成,合成,1616進(jìn)制數(shù)格式為進(jìn)制數(shù)格式為0 xalrrbbgg0 xalrrbbgg,其中,其中al,bb,gg,rral,bb,gg,rr為為2 2位位1616進(jìn)制數(shù)進(jìn)制數(shù)(0-255)(0-255),用這個(gè)無符號,用這個(gè)無符號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個(gè)半透明的紅、綠、藍(lán)刷子,填個(gè)半透明的紅、綠、藍(lán)刷子,填充充3 3個(gè)矩形,請注意例子中透明度及顏色使用的方法。個(gè)矩形,請注意例子中透明度及顏色使用的方法。 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值設(shè)為值設(shè)為255255,再運(yùn)行一次,再運(yùn)行一次,看看看看有何不同。有何不同。C#C#中還預(yù)定義了一些顏色常數(shù),例如黑色為中還預(yù)定義了一些顏色常數(shù),例如黑色為Color.BlackColor.Black,紅色為,紅色為Color.RedColor.Red等等,等等,請用請用VS2005VS2005幫助系統(tǒng)查幫助系統(tǒng)查看看。 165.4 5.4 畫筆畫筆Pen類類 PenPen類對象指定繪制圖形的外輪廓線寬度和顏色。類對象指定繪制圖形的外輪廓線寬度和顏色。PenPen類有類有4 4個(gè)構(gòu)造函數(shù),分別是:
25、個(gè)構(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為線段終點(diǎn)和起點(diǎn)的外觀。下為線段終點(diǎn)和起點(diǎn)的外觀。下例顯示各種筆的屬性例顯示各種筆的屬性DashStyleDashStyle、EndCapEndCap和和StartCapStartCap不同選項(xiàng)的樣式。主窗體不同選項(xiàng)的樣式。主窗體PaintPaint事件處理事件處理函數(shù)如下,運(yùn)行效果如圖。函數(shù)如下,運(yùn)行效果如圖。 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); /默認(rèn)為實(shí)線筆默認(rèn)為實(shí)線筆 /從點(diǎn)從點(diǎn)(10,10)(10,10)到點(diǎn)到點(diǎn)(100(100,100)100)的實(shí)線,圖中左邊第的實(shí)線,圖中左邊第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條線條線 /點(diǎn)短線風(fēng)格的線點(diǎn)短線風(fēng)格的線 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條線條線 /下條語句設(shè)置雙點(diǎn),短線風(fēng)格的線風(fēng)格下條語句設(shè)置雙點(diǎn),短線風(fēng)格的線風(fēng)格 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=/由點(diǎn)組成的線由點(diǎn)組成的線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=/恢復(fù)實(shí)線筆恢復(fù)實(shí)線筆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)提供了幾個(gè)預(yù)定義畫刷類,包括:系統(tǒng)提供了幾個(gè)預(yù)定義畫刷類,包括: SolidBrushSolidBrush:單色畫刷,在命名空
36、間:單色畫刷,在命名空間System.DrawingSystem.Drawing中定義。中定義。 HatchBrushHatchBrush:陰影畫刷,后:陰影畫刷,后4 4個(gè)畫刷在命名空間個(gè)畫刷在命名空間System.Drawing.Drawing2DSystem.Drawing.Drawing2D中定義。中定義。 TextureBrushTextureBrush:紋理:紋理( (圖像圖像) )畫刷。畫刷。 LinearGradientBrushLinearGradientBrush:兩個(gè)顏色或多個(gè)顏色線性漸:兩個(gè)顏色或多個(gè)顏色線性漸變畫刷。變畫刷。 PathGradientBrushPath
37、GradientBrush:使用路徑定義刷子形狀的復(fù)雜:使用路徑定義刷子形狀的復(fù)雜漸變畫刷。漸變畫刷。 225.5.1 單色畫刷單色畫刷SolidBrush 前邊已使用過單色畫刷前邊已使用過單色畫刷。其構(gòu)造函數(shù)只有其構(gòu)造函數(shù)只有1 1個(gè),定義個(gè),定義如下:如下:/建立指定顏色的畫刷建立指定顏色的畫刷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為不同值時(shí)陰影畫刷的不為不同值時(shí)陰影畫刷的不同樣式。在同樣式。在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圖圖 / /運(yùn)行效果如圖運(yùn)行效果如圖 26275.5.3 5.5.3 紋理紋理(圖像圖像)畫刷畫刷TextureBrush 紋理紋理( (圖像圖像) )畫刷使用圖像填充封閉曲線的內(nèi)部,有畫刷使用圖像填充封閉曲線的內(nèi)部,有8 8個(gè)構(gòu)造函數(shù),最簡單的構(gòu)造函數(shù)如下,參數(shù)為畫刷個(gè)構(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)中的一個(gè)位圖文件,操作系統(tǒng)中的一個(gè)位圖文件,應(yīng)用程序運(yùn)行效果如圖。應(yīng)用程序運(yùn)行效果如圖。 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類類 自學(xué)自學(xué)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從點(diǎn)從點(diǎn)(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從點(diǎn)從點(diǎn)(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ù)學(xué)函數(shù)使用數(shù)學(xué)函數(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個(gè)周期正弦曲線個(gè)周期正弦曲線 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; / /運(yùn)行,在窗體中可以看到一條紅色正弦曲線如圖運(yùn)行,在窗體中可以看到一條紅色正弦曲線如圖3536【例例5.95.9】在在WindowsWindows畫圖程序中,可以拖動鼠標(biāo)畫任畫圖程序中,可以拖動鼠標(biāo)畫任意曲線。本例實(shí)現(xiàn)意曲線。本例實(shí)現(xiàn)用拖動鼠標(biāo)左鍵在主窗體中畫曲用拖動鼠標(biāo)左鍵在主窗體中畫曲線。每條曲線都是由若干很短的線段組成。鼠標(biāo)左線。每條曲線都是由
58、若干很短的線段組成。鼠標(biāo)左鍵在按下狀態(tài),移動鼠標(biāo),每次移動很短距離,畫鍵在按下狀態(tài),移動鼠標(biāo),每次移動很短距離,畫出這段線段,所有這些線段組合起來,形成一條曲出這段線段,所有這些線段組合起來,形成一條曲線。線。 1.1. 新建項(xiàng)目。在新建項(xiàng)目。在Form1Form1類中增加兩個(gè)私有變量類中增加兩個(gè)私有變量: : /表示鼠標(biāo)左鍵是否按下,如按下鼠標(biāo)再移動將畫曲線表示鼠標(biāo)左鍵是否按下,如按下鼠標(biāo)再移動將畫曲線private bool mark=false;private bool mark=false;/記錄畫下一條很短線段的起始點(diǎn)記錄畫下一條很短線段的起始點(diǎn) 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) /如果鼠標(biāo)左鍵按下如果鼠標(biāo)左鍵按下 /記錄曲線的第一個(gè)點(diǎn)的坐標(biāo),為記錄曲線的第一個(gè)點(diǎn)的坐標(biāo),為畫線段的起始點(diǎn)畫線段的起始點(diǎn) point.X=e.X; point.X=e.X; point.Y=e.Y; point.Y=e.Y; mark=true; mark=true;/表示鼠標(biāo)左鍵已按下,鼠標(biāo)如果再移動,將畫曲線表示鼠標(biāo)左鍵已按下,鼠標(biāo)如果再移動,將畫曲線 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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒餃子課件教學(xué)課件
- 航模科普課件教學(xué)課件
- 排球運(yùn)動單元計(jì)劃清單及教案設(shè)計(jì)
- 上海保健用品行業(yè)勞動合同樣本
- 企業(yè)內(nèi)部治安管理規(guī)范
- 臨時(shí)IT顧問工作合同
- 互聯(lián)網(wǎng)娛樂產(chǎn)業(yè)協(xié)議
- 三方合作有色金屬協(xié)議樣本
- 個(gè)人租賃房屋合同樣本
- 傳染病檔案系統(tǒng)管理制度
- GB/T 10476-2024尿素高壓冷凝器技術(shù)條件
- 人教版小學(xué)數(shù)學(xué)四年級上冊教材分析
- 國家執(zhí)業(yè)醫(yī)師資格考試題庫(針灸學(xué))
- 茅臺紅酒推銷文案策劃案例
- 期中達(dá)標(biāo)測試卷(試題)-2024-2025學(xué)年統(tǒng)編版(2024)語文一年級上冊
- 2024年地質(zhì)礦產(chǎn)勘測行業(yè)技能鑒定考試-地質(zhì)錄井技能考試近5年真題集錦(頻考類試題)帶答案
- 第四章第1節(jié) 陸地與海洋第1課時(shí)教學(xué)設(shè)計(jì)-2024-2025學(xué)年商務(wù)星球版七年級上冊地理
- 社保知識競賽考試題及答案
- 九上道德與法治期中復(fù)習(xí)提綱(知識梳理)(全冊)
- 1-4單元期中提升卷(試題)-2024-2025學(xué)年五年級上冊數(shù)學(xué)人教版
- 生物化學(xué)第二章核酸的結(jié)構(gòu)和功能
評論
0/150
提交評論