第10章-圖形圖像與多媒體_第1頁
第10章-圖形圖像與多媒體_第2頁
第10章-圖形圖像與多媒體_第3頁
第10章-圖形圖像與多媒體_第4頁
第10章-圖形圖像與多媒體_第5頁
已閱讀5頁,還剩110頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第10章圖形圖像與多媒體目錄.1圖形圖像程序設(shè)計(jì)10.1.1Shape組件10.1.2Image組件10.1.3畫布對(duì)象Canvas110.2多媒體程序設(shè)計(jì)10.2.1Animate組件10.2.2MediaPlayer組件210.3小結(jié)310.4習(xí)題4圖形圖像與多媒體技術(shù)可以為應(yīng)用程序增色不少,在Delphi應(yīng)用程序中使用圖形圖像與多媒體技術(shù)有多種方法:可以在設(shè)計(jì)階段通過圖形圖像組件插入已經(jīng)繪制好的圖片,也可以在運(yùn)行階段動(dòng)態(tài)的繪制它們;同樣可以利用Delphi的多媒體組件播放音頻或視頻剪輯。本章將介紹Delphi標(biāo)準(zhǔn)組件庫中圖形圖像組件(對(duì)象)和多媒體組件的用法。10.1圖形圖像程序設(shè)計(jì)Delphi標(biāo)準(zhǔn)組件庫中的圖形圖像組件(對(duì)象)主要有以下四個(gè):TShape,TImage,TCanvas,TPainBox。其中TCanvas并不是可視的組件,而是專門用來進(jìn)行圖形圖像處理的畫布對(duì)象。下面分別介紹它們的功能與用法。10.1.1Shape組件TShape組件是組件面板Additional選項(xiàng)頁上的第七個(gè)組件,可以用它來在窗體上顯示一個(gè)簡單的幾何形狀,比如矩形、圓形等。1.TShape組件的重要屬性1)shape屬性:該屬性是枚舉類型,可用來在設(shè)計(jì)期或運(yùn)行期指定Shape組件顯示的幾何形狀,其可能的取值及意義見表10-1:表10-1Shape屬性可能取值及意義列表2)brush屬性:它是TBrush類型的對(duì)象,包含兩個(gè)子屬性:color和style。其中color屬性為Tcolor類型,用來指定幾何圖形的填充色。Style為TBrushStyle類型,則用來指定填充的底紋圖形。它是一個(gè)枚舉類型,可能的取值及其意義見圖10-1:圖10-1Style屬性可能取值及樣式3)pen屬性:它是TPen類型的對(duì)象,用來定義繪制要顯示的幾何圖形的輪廓線的樣式,如線條的顏色、寬度、虛實(shí)和模式等。它包含有幾個(gè)子屬性,下面分別介紹。Color:指定繪制幾何圖形輪廓線的顏色,TColor類型。注意它和Brush屬性中的color屬性的區(qū)別。Width:指定所繪制線條的粗細(xì),單位是像素。它是Integer類型,但如果給定的值小于0時(shí),會(huì)被忽略。另外,它的取值將影響style的有效取值。Style:確定所顯示幾何圖形輪廓線的虛實(shí)、是否顯示等樣式。它是TPenStyle類型的枚舉類型,可能的取值及意義如表10-2:表10-2畫筆對(duì)象的樣式屬性可能取值及意義需要說明的是,只有當(dāng)width屬性的取值等于1時(shí),style屬性取psDash、psDot、psDashDot、psDashDotDot值才會(huì)有效。Mode:指定畫筆顏色和畫布顏色的相互作用效果,對(duì)線段重新賦值,但是不會(huì)改變當(dāng)前的Color值。它是TPenMode類型的枚舉類型,可選的取值及其意義見表10-3:表10-3畫筆對(duì)象模式屬性取值及意義2.TShape組件應(yīng)用舉例例10-1:新建一VclFormsApplication-DelphiforWin32工程,窗體設(shè)計(jì)如圖10-2:圖10-2Tshape組件應(yīng)用示例程序界面其中三個(gè)下拉列表框中分表列出相應(yīng)的屬性可選的值,以備用戶選擇。主要的代碼:改變繪制的幾何形狀:(以“圓”為例)procedureTForm1.BitBtn1Click(Sender:TObject);beginshape1.Shape:=stcircle;end;其余按鈕事件代碼與此類似,只是Shape屬性取值改為相應(yīng)形狀值即可。選擇畫刷顏色的代碼:(畫筆顏色的選取代碼與此類似)procedureTForm1.Button1Click(Sender:TObject);beginifcolordialog1.Executethenshape1.Brush.Color:=colordialog1.Color;end;畫刷樣式的選擇代碼:(其余2個(gè)與此類似)procedureTForm1.ComboBox1Change(Sender:TObject);begincasecombobox1.ItemIndexof0:shape1.Brush.Style:=bssolid;1:shape1.Brush.Style:=bsclear;2:shape1.Brush.Style:=bsbdiagonal;3:shape1.Brush.Style:=bsfdiagonal;4:shape1.Brush.Style:=bscross;5:shape1.Brush.Style:=bsdiagcross;6:shape1.Brush.Style:=bshorizontal;7:shape1.Brush.Style:=bsvertical;end;end;設(shè)置畫筆粗細(xì)的代碼:procedureTForm1.Edit1KeyPress(Sender:TObject;varKey:Char);beginif(key=#13)thenif(edit1.Text<>'')and(edit1.text<>'-')thenbeginshape1.Pen.Width:=strtoint(edit1.Text);exit;endelseexitelse;if(key='-')and(edit1.Text='')thenexit;ifnot(keyin['0'..'9'])thenbeginkey:=#0;exit;end;if(key='0')and(edit1.Text='0')thenkey:=#0;end;10.1.2Image組件Image是一個(gè)容器組件,可以用來在窗體上指定的矩形區(qū)域內(nèi)顯示和輸出一幅圖片。具體的做法是通過其Picture屬性中引用的Picture對(duì)象,封裝了圖片裝入、清除等功能。并且該組件還引入幾個(gè)屬性專門用來控制圖片顯示的邊界問題,功能強(qiáng)大,使用簡便。下面介紹幾個(gè)重要屬性及方法。1. Image組件的重要屬性。1)Picture屬性:該屬性為一個(gè)TPicture類的對(duì)象引用,用來裝入并顯示Image組件顯示的圖片??梢允褂闷鋑raphic、bitmap、icon、metafile屬性指定要顯示的圖形、位圖、圖標(biāo)、windows圖元等格式的圖片,也可以使用loadfromfile(LoadFromClipboardFormat)方法從指定文件(剪貼板)中裝載圖片。例如:Image1.picture.loadfromfile(‘d:\mybmp.bmp’);2)Autosize屬性:該屬性為Boolean類型,指定當(dāng)所顯示圖片大小與組件大小不相適應(yīng)時(shí),TImage組件大小是否自動(dòng)變化以適應(yīng)圖片的大小。默認(rèn)值為False。3)Proportional屬性:該屬性為Boolean類型,用來指定當(dāng)圖片大小大于組件大小時(shí),是否按比例縮小圖片以實(shí)現(xiàn)不失真的完整顯示圖片。如果圖片尺寸較小時(shí)則正常顯示。默認(rèn)值為False。4)Stretch屬性:該屬性為Boolean類型,用來確定是否改變所裝載圖片來適應(yīng)TImage組件的大小和形狀。值為True時(shí),當(dāng)TImage組件的大小和形狀改變時(shí),圖片的大小和形狀也會(huì)相應(yīng)變化。由于不是簡單的按比例縮放,所以當(dāng)TImage組件的形狀不同與圖片形狀時(shí),Stretch操作將會(huì)使圖片扭曲失真。該屬性默認(rèn)值為False。5)Center屬性:該屬性是Boolean類型,用來確定當(dāng)所裝載圖片大小和組件大小不相適應(yīng)時(shí),圖片顯示的位置。該值為True時(shí),圖片顯示在組件的正中央;該值為False時(shí),圖片的左上角從組件的左上角開始顯示。只有在AutoSize屬性和Stretch屬性均為False時(shí),該屬性才有效。認(rèn)值為False。6)Transparent屬性:該屬性是Boolean類型,用來確定所顯示的圖片對(duì)于后面層的組件是否透明。當(dāng)值為True時(shí),圖片背后的組件依然可見,否則會(huì)被圖片遮擋而不可見。但如果組件沒有裝載圖片,則該屬性值沒有效果。該屬性只對(duì)位圖類型圖片有效。默認(rèn)值為False。7)Canvas對(duì)象:該對(duì)象提供TImage組件可供作圖的“畫布”,可以通過其屬性、方法等實(shí)現(xiàn)圖形繪制、圖像處理等。詳見10.1.3畫布對(duì)象CanvasTImage組件的應(yīng)用示例見例10-4。10.1.3畫布對(duì)象CanvasDelphi應(yīng)用程序處理圖形圖像除了可以使用以上的組件外,還提供了一個(gè)功能十分強(qiáng)大的TCanvas類。該類封裝了大多數(shù)在窗體或面板之類容器上繪圖所需的WindowsAPI函數(shù),用戶在使用時(shí)只需要設(shè)置一些屬性、調(diào)用相應(yīng)的成員方法就可以實(shí)現(xiàn)繪圖功能,而不需要只接面對(duì)Windows的設(shè)備場景(DC),也不需要申請(qǐng)和維護(hù)句柄資源。系統(tǒng)定義了一個(gè)TCanvas類的對(duì)象,稱為畫布對(duì)象(Canvas)。它通常作為其它組件的一個(gè)屬性,不單獨(dú)使用。每個(gè)由TControl類派生出來的類都有該屬性,相當(dāng)于把這些類組件的客戶區(qū)看成是一張空白的畫布,充許用戶在其上繪制任意圖形或輸出文字。下面介紹該對(duì)象的具體用法。1.Canvas的重要屬性畫布對(duì)象的主要屬性有Pen、Brush、Pixels、PenPos、Font等,用來定義繪制圖形的風(fēng)格。其中Pen和Brush的功能與用法與TShape中類似,這里不再贅述。

1)Pixels屬性:該屬性用來存取Canvas中每個(gè)像素點(diǎn)的顏色值,其定義如下:

propertyPixels[X,Y:Integer]:TColor;

其中X、Y表示某像素點(diǎn)在畫布上的坐標(biāo)位置,以像素為單位;屬性值表示該像素點(diǎn)的顏色值,為TColor類型。實(shí)際上,一個(gè)繪圖過程就是將畫布指定區(qū)域的所有像素指定為特定值的過程,最后形成視覺上的圖形。下面程序段完成在窗體客戶區(qū)中央畫一條紅色水平線的功能:Fori:=0toself.widthdoSelf.canvas.pixels[i,self.heightdiv2]:=clred;同理,通過讀取該屬性,即可獲取某像素點(diǎn)的當(dāng)前顏色值。注意:不是所有的設(shè)備場景(DeviceContext)都支持像素操作,如果設(shè)置場景不支持像素操作,或所讀取像素坐標(biāo)在指定的畫布區(qū)域之外,則返回值為-1,而此時(shí)的寫像素操作不做任何事情。2)PenPos屬性:該屬性表示畫筆在畫布上的當(dāng)前位置,類型為TPoint。通過讀取該屬性,可以知道當(dāng)前畫筆所在位置,而設(shè)置該屬性,則可以移動(dòng)畫筆到指定位置。下面代碼將移動(dòng)畫筆位置到坐標(biāo)(100,100)處:Self.canvas.penpos:=point(100,100);3)Font屬性:該屬性為TFont類型,用來定義在畫布上輸出文字的屬性。下面代碼在窗體上以宋體14號(hào)綠色字體輸出“HelloWorld!”:self.canvas.Font.Color:=clgreen;self.Canvas.Font.Name:='宋體';self.Canvas.Font.Size:=12;self.Canvas.TextOut(200,200,'Hello,world!');2.常用繪圖方法在繪圖過程中,將畫布看成是多行和多列像素點(diǎn)構(gòu)成的矩陣,每個(gè)像素點(diǎn)用一個(gè)平面直角坐標(biāo)系的坐標(biāo)來描述。該坐標(biāo)系是以畫布客戶區(qū)的左上角作為坐標(biāo)原點(diǎn),以小平向右方向作為X軸正方向,垂直向下方向作為Y軸正方向建立的。畫布對(duì)象封裝了很多圖形圖像處理的方法,這里介紹其中比較常用的部分方法。1)MoveTo:過程定義:procedureMoveTo(X,Y:Integer);其功能是將畫筆的當(dāng)前位置移動(dòng)到點(diǎn)(X、Y)處。調(diào)用該方法與修改PenPos屬性等效。查看Delphi的源代碼可以發(fā)現(xiàn),PenPos的寫方法SetPenPos就是通過調(diào)用MoveTo方法實(shí)現(xiàn)的,源碼如下://摘自Delphi源碼Graphics.pas單元procedureTCanvas.SetPenPos(Value:TPoint);beginMoveTo(Value.X,Value.Y);end;注意:在繪圖過程中,某個(gè)繪圖動(dòng)作之前,必須先要確定畫筆的當(dāng)前位置。如果下一圖形的起始不是接著上一圖形的終止位置,則必須要移動(dòng)畫筆。所以整個(gè)繪圖過程可能要多次用到移動(dòng)畫筆的操作。2)LineTo:過程定義:procedureLineTo(X,Y:Integer);其功能是在畫布上從當(dāng)前畫筆位置處始,至像素點(diǎn)(X、Y)處畫一直線,并將畫筆位置移至像素點(diǎn)(X、Y)處。下面代碼同樣可完成在窗體客戶區(qū)中央畫一紅色水平線:Self.canvas.pen.color:=clred;Self.canvas.moteto(0,self.heightdiv2);Self.canvas.lineto(self.width,self.heightdiv2);3)Rectangle:過程定義如下:procedureRectangle(X1,Y1,X2,Y2:Integer);overload;procedureRectangle(constRect:TRect);overload;

其功能為在畫布上用當(dāng)前畫筆繪制矩形區(qū)域,并用當(dāng)前畫刷進(jìn)行填充。根據(jù)指定矩形區(qū)域的方法不同,該方法有兩種重載形式。第一種形式用給出矩形區(qū)域左上角坐標(biāo)(X1、Y1)和右下角坐標(biāo)(X2、Y2)的方法指定矩形區(qū)域,第二種形式用一個(gè)TRect類型數(shù)據(jù)給定矩形區(qū)域。下面代碼完成在定時(shí)器控制下每隔指定時(shí)間在窗體上畫隨機(jī)矩形的功能:procedureTForm1.Timer1Timer(Sender:TObject);beginX:=Random(Screen.Width-10);Y:=Random(Screen.Height-10);Canvas.Pen.Color:=Random(65535);caseRandom(5)of0:Canvas.Pen.Style:=psSolid;1:Canvas.Pen.Style:=psDash;2:Canvas.Pen.Style:=psDot;3:Canvas.Pen.Style:=psDashDot;4:Canvas.Pen.Style:=psDashDotDot;end;Canvas.Rectangle(X,Y,X+Random(400),Y+Random(400));end;說明:與Rectangle類似的方法還有FillRect和FrameRect。FillRect的功能是用當(dāng)前畫刷填充指定的矩形區(qū)域,但并不用當(dāng)前畫筆畫出邊線;FrameRect的功能則是用當(dāng)前畫刷顏色畫出指定矩形區(qū)域的邊線卻并不填充。4)Ellipse:過程定義如下:procedureEllipse(X1,Y1,X2,Y2:Integer);overload;procedureEllipse(constRect:TRect);overload;其功能是在畫布上用當(dāng)前畫筆畫指定矩形區(qū)域的內(nèi)切橢圓,并用當(dāng)前畫刷填充。該函數(shù)同Rectangle方法一樣,由給定矩形區(qū)域的不同有兩種重載形式。例如:self.Canvas.Ellipse(100,100,200,200);也可寫為:self.Canvas.Ellipse(Rect(100,100,200,200));5)RoundRect:過程定義:procedureRoundRect(X1,Y1,X2,Y2,X3,Y3:Integer);其功能是在由(X1、Y1)和(X2、Y2)兩點(diǎn)確定的矩形區(qū)域內(nèi),用當(dāng)前畫筆畫一圓角矩形,并用當(dāng)前畫刷填充整個(gè)區(qū)域。每個(gè)角的弧線曲率區(qū)配由參數(shù)X3指定寬度、Y3指定高度的橢圓。例如:self.Canvas.RoundRect(300,300,500,500,50,50);6)PolyGon:過程定義:procedurePolygon(Points:arrayofTPoint);其功能為依次用當(dāng)前畫筆色畫直線連接參數(shù)所列像素點(diǎn),并把最后一個(gè)像素點(diǎn)和第一個(gè)像素點(diǎn)連接,構(gòu)成一個(gè)封閉的多邊形區(qū)域,并用當(dāng)前畫刷顏色填充該區(qū)域。注意,該方法的參數(shù)是一個(gè)TPoint類型的數(shù)組,每個(gè)元素表示多邊形一個(gè)頂點(diǎn)坐標(biāo)。示例:self.Canvas.Polygon([point(300,300),point(400,300),point(400,400),point(300,400)]);思考:你能用另一種方法完成上例的繪圖功能嗎?7)PolyLine:過程定義:procedurePolyline(Points:arrayofTPoint);其功能是用當(dāng)前畫筆依次畫直線連接參數(shù)所列各像素點(diǎn)。與PolyGon不同的是該方法并不連接終止點(diǎn)與起始點(diǎn),因而不會(huì)形成封閉的區(qū)域。另外,該方法不改變PenPos的值。分析下面兩條語句:

LineTo(200,200);其功能為從當(dāng)前畫筆位置處畫線至點(diǎn)(200,200),最后畫筆位置在點(diǎn)(200,200)處;PolyLine([self.Canvas.PenPos,Point(200,200)]);其功能為從當(dāng)前畫筆位置處畫線至點(diǎn)(200,200),最后畫筆位置并不改變。思考:用PolyLine方法可以畫多邊形嗎?如果可以,該如何做?8)Arc:過程定義:procedureArc(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer);其功能是用當(dāng)前畫筆畫橢圓上的一段弧。該橢圓為點(diǎn)(X1、Y1)和點(diǎn)(X2、Y2)所確定矩形的內(nèi)切橢圓。這段弧由起點(diǎn)開始,按逆時(shí)針方向畫到終點(diǎn)。弧的起點(diǎn)為橢圓圓周和點(diǎn)(X3、Y3)與橢圓中心點(diǎn)連線的交點(diǎn),弧的終點(diǎn)為橢圓圓周和點(diǎn)(X4、Y4)與橢圓中心點(diǎn)連線的交點(diǎn)。例如:self.Canvas.Arc(200,200,400,500,600,100,100,100);9)Chord:過程定義:procedureChord(X1,Y1,X2,Y2,X3,Y3,X4,Y4:Integer);其功能為用當(dāng)前畫筆畫一個(gè)由一段弧及連接弧起點(diǎn)和終點(diǎn)的弦構(gòu)成的弓形,并用當(dāng)前畫刷填充該區(qū)域。該弧為點(diǎn)(X1、Y1)和點(diǎn)(X2、Y2)所確定矩形的內(nèi)切橢圓上的一段。該函數(shù)從點(diǎn)(X3、Y3)開始,逆時(shí)什方向沿橢圓圓周畫弧至(X4,Y4)點(diǎn),然后再直接畫直線回到點(diǎn)(X3、Y3)。例如:self.Canvas.Chord(200,200,400,500,100,100,600,100);10)TextOut:過程定義:procedureTextOut(X,Y:Integer;constText:string);其功能為在當(dāng)前畫布的指定位置處以當(dāng)前字體屬性輸出指定的字符串。當(dāng)字符串輸出完畢后,畫筆停留在該字符串的右上方。如下例:self.canvas.Font.Color:=clgreen;self.Canvas.Font.Name:='宋體';self.Canvas.Font.Size:=12;self.Canvas.TextOut(200,200,'Hello,world!');11)BrushCopy:過程定義如下:procedureBrushCopy(constDest:TRect;Bitmap:TBitmap;constSource:TRect;Color:TColor);其功能為拷貝位圖Bitmap中Source區(qū)域的圖像至當(dāng)前畫布的Dest區(qū)域,Color參數(shù)則指定位圖中將被畫布的畫刷顏色替抽換的顏色值。該方法可以實(shí)現(xiàn)一些圖像的特效顯示,比如部分透明。如下例:varBitmap:TBitmap;MyRect,MyOther:TRect;beginMyRect:=Rect(10,10,100,100);MyOther:=Rect(10,111,100,201);Bitmap:=TBitmap.Create;Bitmap.LoadFromFile('c:\windows\tartan.bmp');Form1.Canvas.BrushCopy(MyRect,Bitmap,MyRect,clBlack);Form1.Canvas.CopyRect(MyOther,Bitmap.Canvas,MyRect);Bitmap.Free;end;12)CopyRect:過程定義:procedureCopyRect(constDest:TRect;Canvas:TCanvas;constSource:TRect);其功能是按當(dāng)前的拷貝模式設(shè)置從另外一個(gè)畫布對(duì)象中拷貝部分圖像到當(dāng)前畫布。其中參數(shù)Canvas指定源畫布,參數(shù)Source指定源畫布中待拷貝的區(qū)域,參數(shù)Dest指定當(dāng)前畫布接收?qǐng)D像的區(qū)域。如果Dest區(qū)域的大小與Source區(qū)域的大小不一致,則相當(dāng)于完成對(duì)拷貝部分的圖像進(jìn)行放縮操作。利用CopyRect方法可以實(shí)現(xiàn)多種圖像顯示的特殊效果,在本節(jié)的示例10-4中會(huì)演示其用法。13)Draw:過程定義:procedureDraw(X,Y:Integer;Graphic:TGraphic);其功能是將參數(shù)Graphic指定的圖像畫在當(dāng)前畫布上,圖像的左上角定位在點(diǎn)(X,Y)處。圖像可以是位圖、圖標(biāo)或圖元格式。如果是位圖格式,則遵照CopyMode屬性設(shè)置的模式繪制圖像。如下例:varBitmap:TBitMap;beginBitmap:=TBitmap.Create;trywithBitmapdobeginLoadFromFile('d:\factory.bmp');Transparent:=True;TransParentColor:=BitMap.canvas.pixels[50,50];Form1.Canvas.Draw(0,0,BitMap);TransparentMode:=tmAuto;Form1.Canvas.Draw(50,50,BitMap);end;finallyBitmap.Free;end;end;3.畫布對(duì)象應(yīng)用舉例例10-2.簡單的鼠標(biāo)畫圖程序本例制作一個(gè)用鼠標(biāo)畫簡單圖形的程序,其關(guān)鍵部分是鼠標(biāo)事件的響應(yīng)。窗體制作如圖10-3:圖10-3畫圖程序界面圖10-3畫圖程序界面主要代碼如下:圖形選擇菜單項(xiàng)單擊事件:procedureTForm1.N9Click(Sender:TObject);begingra:=0;//gra全部變量,表示用戶選擇的圖形類型。end;按下鼠標(biāo)后,虛線繪制圖形輪廓代碼:procedureTForm1.FormMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);beginifbutton=mbleftthenbegindrag:=true;xx:=x;yy:=y;x1:=x;y1:=y;canvas.MoveTo(x,y);

end;end;procedureTForm1.FormMouseMove(Sender:TObject;Shift:TShiftState;X,Y:Integer);begincasegraof0,1:ifdragthenbeginif(x1<>xx)and(y1<>yy)thenbegincanvas.pen.Color:=form1.Color;canvas.Pen.Width:=4;canvas.MoveTo(xx,yy);canvas.Pen.Style:=pssolid;canvas.LineTo(x1,y1);end;canvas.Pen.Style:=psdot;canvas.Pen.Color:=colordialog1.Color;canvas.Pen.Width:=0;canvas.MoveTo(xx,yy);canvas.LineTo(x,y);x1:=x;y1:=y;end;

2:ifdragthenbeginif(x1<>xx)and(y1<>yy)thenbegincanvas.pen.Color:=form1.Color;canvas.Pen.Width:=4;canvas.MoveTo(xx,yy);canvas.Pen.Style:=pssolid;canvas.Rectangle(xx,yy,x1,y1);end;canvas.Pen.Style:=psdot;canvas.Pen.Color:=colordialog1.Color;canvas.Pen.Width:=0;canvas.MoveTo(xx,yy);canvas.Rectangle(xx,yy,x,y);x1:=x;y1:=y;end;3://此部分代碼省略,有興趣讀者可以自已補(bǔ)充;

……11:elseifdragthencanvas.LineTo(x,y);end;end;松開鼠標(biāo)后,實(shí)際畫圖操作:procedureTForm1.FormMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);begindrag:=false;casegraof0:begincanvas.MoveTo(xx,yy);canvas.Pen.Style:=pssolid;canvas.LineTo(x,y);end;1:begincanvas.MoveTo(xx,yy);canvas.Pen.Style:=psdot;canvas.LineTo(x,y);end;2:begincanvas.MoveTo(xx,yy);canvas.Pen.Color:=form1.Color;canvas.Rectangle(xx,yy,x1,y1);canvas.MoveTo(xx,yy);canvas.Pen.Style:=pssolid;canvas.Pen.Color:=pencolor;canvas.Arc(xx,yy,x1,y1,xx,yy,x1,y1);end;//情況3—11代碼省圖,有興趣的讀者請(qǐng)自己補(bǔ)充完整

end;tempg.Width:=form1.ClientWidth;tempg.Height:=form1.ClientHeight;Tempg.Canvas.CopyRect(rect(0,0,tempg.Width,tempg.Height),form1.Canvas,rect(0,0,tempg.Width,tempg.Height));end;“保存”已繪圖形代碼:procedureTForm1.N25Click(Sender:TObject);begintempg.Width:=form1.ClientWidth;tempg.Height:=form1.ClientHeight;tempg.Canvas.CopyRect(rect(0,0,tempg.Width,tempg.Height),form1.Canvas,rect(0,0,tempg.Width,tempg.Height));ifsavedialog1.Executethentempg.SaveToFile(savedialog1.FileName);end;代碼中的tempg為一個(gè)全局tbitmap對(duì)象,在窗體創(chuàng)建時(shí)被程序創(chuàng)建,用來臨時(shí)保存已繪的圖像,以保證當(dāng)窗體重繪時(shí),圖像不會(huì)丟失,如下代碼:procedureTForm1.FormPaint(Sender:TObject);beginform1.Canvas.copyrect(rect(0,0,tempg.Width,tempg.Height),tempg.Canvas,rect(0,0,tempg.Width,tempg.Height));end;利用窗體的畫布對(duì)象,合理的設(shè)計(jì)與編寫窗體鼠標(biāo)事件的處理過程,即可實(shí)現(xiàn)簡單的畫筆程序,有興趣的讀者不妨自己去嘗試把本例進(jìn)一步擴(kuò)充和完善。例10-3.繪制正弦曲線本例演示如何繪制一個(gè)正弦函數(shù)圖像,其關(guān)健是圖像所含像素點(diǎn)坐標(biāo)的計(jì)算和兩個(gè)坐標(biāo)系下坐標(biāo)的變換。運(yùn)行結(jié)果如圖10-4:圖10-4繪制正弦曲線程序運(yùn)行結(jié)果繪制代碼如下:procedureTForm1.BitBtn1Click(Sender:TObject);varx,y,i:integer;py:real;begincanvas.MoveTo(0,form1.ClientHeightdiv2);canvas.LineTo(form1.ClientWidth,form1.ClientHeightdiv2);canvas.MoveTo(form1.ClientWidthdiv2,0);canvas.LineTo(form1.ClientWidthdiv2,form1.ClientHeight);fori:=-(form1.clientwidthdiv2)to(form1.ClientWidthdiv2)dobeginpy:=34*sin((imod240)*((2*pi)/240));y:=form1.ClientHeightdiv2-trnc(py);x:=form1.clientwidthdiv2+i;canvas.Pixels[x,y]:=clred;end;end;

實(shí)際上,利用對(duì)像素點(diǎn)的直接訪問,可以實(shí)現(xiàn)很多圖像處理的特殊效果,比如彩色圖像的灰度顯示、浮雕化效果等,有興趣的讀者可以自己去嘗試。例10-4.圖像翻轉(zhuǎn)程序本例演示一個(gè)將圖片按要求翻轉(zhuǎn)的程序,主要原理是利用CopyRect方法,把源區(qū)域和目標(biāo)區(qū)域的對(duì)應(yīng)方向作相應(yīng)變化即可實(shí)現(xiàn)。運(yùn)行效果如圖10-5:圖10-5圖像翻轉(zhuǎn)程序運(yùn)行結(jié)果主要代碼如下:procedureTForm1.BitBtn1Click(Sender:TObject);//打開圖片beginifopenpicturedialog1.Executethenimage1.Picture.LoadFromFile(openpicturedialog1.FileName);end;

procedureTForm1.BitBtn2Click(Sender:TObject);//水平翻轉(zhuǎn)begintembmp.Canvas.CopyMode:=cmsrccopy;tembmp.Canvas.CopyRect(rect(tembmp.Width,0,0,tembmp.Height),image1.Canvas,rect(0,0,image1.Width,image1.Height));image2.Left:=image1.Width+10;image2.Picture.Bitmap:=tembmp;end;procedureTForm1.BitBtn3Click(Sender:TObject);//垂直翻轉(zhuǎn)begintembmp.Canvas.CopyMode:=cmsrccopy;tembmp.Canvas.CopyRect(rect(0,tembmp.Height,tembmp.Width,0),image1.Canvas,rect(0,0,image1.Width,image1.Height));image3.Left:=image1.left;image3.Top:=image1.Height+image1.top+10;image3.Picture.Bitmap:=tembmp;end;procedureTForm1.BitBtn4Click(Sender:TObject);//對(duì)角翻轉(zhuǎn)begintembmp.Canvas.CopyMode:=cmsrccopy;tembmp.Canvas.CopyRect(rect(tembmp.Width,tembmp.Height,0,0),image1.Canvas,rect(0,0,image1.Width,image1.Height));image4.Left:=image1.Width+10;image4.Top:=image1.Height+image1.top+10;image4.Picture.Bitmap:=tembmp;end;實(shí)際上,靈活使用CopyRect方法,可以實(shí)現(xiàn)很多種圖像顯示的特殊效果,比如拉幕式、百葉窗式、漸隱漸顯式等不同的圖像顯示方式。具體實(shí)現(xiàn)方法請(qǐng)讀者自已去思考、嘗試。10.1.4Paintbox組件在程序中,除了可以利用窗體的Canvas對(duì)象直接在窗體上繪圖外,還可以利用PaintBox組件來作圖。該組件在System選項(xiàng)卡上,用它繪圖的方法與在窗體上直接繪圖類似,不同的是,這時(shí)的坐標(biāo)是以TPainBox組件的Canvas左上角作為坐標(biāo)原點(diǎn)的,因此不需要考慮其在窗體中的位置。另外,可以在設(shè)計(jì)期定義該組件的大小和位置,當(dāng)所繪制圖形大與該組件的畫布區(qū)域時(shí),超出部分將自動(dòng)切割。與Image組件不同的是,該組件內(nèi)繪制的圖形如果希望在窗體及組件重繪后保持,則必須在其OnPaint事件的處理代碼中重繪這部分圖形。如下例:新建一VclFormsApplication-DelphiforWin32工程,在窗體上加入一個(gè)Button組件,一個(gè)PainBox組件,然后編寫下面兩個(gè)事件處理代碼:procedureForm1.Button1Click(Sender:TObject);beginPaintBox1.Canvas.Brush.Color:=clRed;PaintBox1.Canvas.FillRect(PaintBox1.Canvas.ClipRect);PaintBox1.Canvas.Ellipse(0,0,100,100);end;procedureForm1.PaintBox1Paint(Sender:TObject);beginPaintBox1.Canvas.Ellipse(0,0,100,100);end; 編譯運(yùn)行該程序,可以看到窗體上出現(xiàn)一個(gè)橢圓,單擊Button后出現(xiàn)一個(gè)紅色矩形區(qū)域。但當(dāng)把窗體最小化再還原后,觀察圖形發(fā)現(xiàn)橢圓還在,但紅色矩形區(qū)域卻消失了。10.2多媒體程序設(shè)計(jì)除了強(qiáng)大的圖形圖像處理能力,Delphi應(yīng)用程序同樣支持音、視頻的處理。在Win32選項(xiàng)卡上的Animate組件可以用來播放無聲的AVI視頻片斷,而MediaPlayer組件則可以提供對(duì)常見音、視頻格式的處理功能,例如WAV、CD、MIDI、MP3等。10.2.1Animate組件Animate的使用比較簡單:將該組件放置在窗體的適當(dāng)位置,選定要播放的動(dòng)畫剪輯,設(shè)定重復(fù)播放次數(shù),然后將其Active屬性改為True,動(dòng)畫立即開始播放,在設(shè)計(jì)期就可以看到效果。該組件播放的動(dòng)話剪輯有兩種來源,一種是來自指定的AVI文件,另外一種是Windows的內(nèi)部動(dòng)畫,如查找、刪除文件等。具體設(shè)定方法很簡單,只需要設(shè)置相應(yīng)屬性即可。1.Animate的重要屬性1)CommonAVI:用來指定播放Windows系統(tǒng)Shell32.dll中的哪一段內(nèi)部動(dòng)畫剪輯。這些動(dòng)畫就是系統(tǒng)在用戶做文件操作時(shí)播放的。其可能的值及說明如表10-4:表10-4可用的預(yù)置動(dòng)畫列表

2)FileName:用來指定要從文件中裝入的外部AVI動(dòng)畫的文件名。如果裝載成功,則自動(dòng)設(shè)置Open屬性為True。如果動(dòng)畫中包含有聲音,則被忽略。注意:該屬性與CommonAVI是互斥的。如果設(shè)置FileName屬性,則CommonAVI屬性會(huì)被自動(dòng)設(shè)置為aviNone;如果設(shè)置CommonAVI屬性為非aviNone值,則FileName屬性會(huì)被自動(dòng)設(shè)置為空。3)FrameCount:保存TAnimate組件所裝載動(dòng)畫的總幀數(shù)。4)StartFrame和StopFrame:指定TAnimate組件將要播放動(dòng)畫的起始幀號(hào)和結(jié)束幀號(hào)。幀數(shù)序號(hào)從1開始。默認(rèn)情況下,當(dāng)一個(gè)動(dòng)畫被裝載后,StartFrame值被設(shè)置為1,StopFrame值被設(shè)置為FrameCount值,即全部播放。可以通過修改這兩個(gè)屬性以實(shí)現(xiàn)只播放一部分幀的功能,但應(yīng)滿足StartFrame<=FrameCount。5)Repetitions:該屬性值指定當(dāng)Active屬性為True后,所選動(dòng)畫剪輯的播放次數(shù)。當(dāng)播放完該屬性指定次數(shù)后,Active屬性值自動(dòng)設(shè)為False。當(dāng)該值小于等于零時(shí),表示不限次數(shù)的重復(fù)播放,直到將Active屬性設(shè)置為False或調(diào)Stop方法停止播放。6)Open:該屬性為Boolean類型,表示TAnimate組件是否已成功裝載動(dòng)畫剪輯并做好播放準(zhǔn)備。當(dāng)成功裝載動(dòng)畫剪輯后,在沒有播放之前,組件會(huì)顯示動(dòng)畫的第StartFrame幀的畫面。當(dāng)屬性值為False時(shí),不會(huì)顯示任何幀畫面。當(dāng)該屬性從False改變?yōu)門rue時(shí),自動(dòng)設(shè)置StartFrame屬性為1,StopFrame屬性為FrameCount值。7)Active:該屬性為Boolean類型,當(dāng)值為True時(shí),組件從已裝載動(dòng)畫剪輯中StartFrame屬性指定的幀開始到StopFrame屬性指定的幀結(jié)束循環(huán)播放Repetitions屬性指定的次數(shù);當(dāng)值設(shè)為False時(shí),結(jié)束播放。默認(rèn)值為False。只有TAnimate的Open屬性為True時(shí)(已成功裝載動(dòng)畫剪輯),Active屬性才可以被設(shè)置為True。2.TAnimate的常用方法1)Play方法:過程定義:procedurePlay(FromFrame,ToFrame:Word;Count:Integer);其功能是從第FromFrame幀到第ToFrame幀,循環(huán)播放已裝載動(dòng)畫剪輯Count次。參數(shù)應(yīng)滿足0=<FromFrame<=ToFrame。Count小于等于零表示無限次循環(huán)播放,直到調(diào)用Stop方法或Active屬性被設(shè)置為False。若調(diào)用前Open屬性為False,則Play方法設(shè)置其為True。明顯地,調(diào)用Play方法,相當(dāng)于設(shè)置StartFrame=FromFrame,StopFrame=ToFrame,Repetitions=Count,然后設(shè)置Active為True。例:animate1.play(1,24,4);2)Stop方法:過程定義:procedureStop;其功能是停止播放動(dòng)畫剪輯。同理,調(diào)用該方法相當(dāng)于設(shè)置Active屬性為False。3)Seek方法:過程定義:procedureSeek(Frame:SmallInt);其功能為將播放畫面定位到動(dòng)畫剪輯的第Frame幀。Frame值小于等于1時(shí),定位于第1幀,F(xiàn)rame值大于等于FrameCount時(shí),定位于最后一幀。若調(diào)用前Open屬性為False,則Seek方法設(shè)置其為True。例:animate1.seek(5);4)Reset方法:過程定義:procedureReset;其功能是將TAinmate組件恢復(fù)到默認(rèn)狀態(tài):關(guān)閉并重新打開TAnimate組件,清除StartFrame和StopFrame的值,顯示第一幀。在此過程中要觸發(fā)OnClose和OnOpen事件。10.2.2MediaPlayer組件媒體播放機(jī)組件(TMediaPlayer)位于組件面板的System標(biāo)簽頁下,它為用戶提供了一組按鈕用于播放控制,每個(gè)按鈕的功能對(duì)應(yīng)一個(gè)方法。程序運(yùn)行時(shí),用戶可以單擊這些按鈕來完成相應(yīng)的的播放控制功能。它們不能被分開作為獨(dú)立的按鈕使用,只作為一個(gè)對(duì)象來接收鼠標(biāo)的單擊事件,然后通過傳遞的按鈕參數(shù)值來確定按下的是哪個(gè)按鈕。這些按鈕功能及類型值如表10-5:表10-5媒體播放面組件按鈕名稱及功能1.TMediaPlayer的重要屬性1)AutoEnable:該屬性用于指定TMediaPlayer是否自動(dòng)設(shè)置每個(gè)控制按鈕是否可用。聲明:propertyAutoEnable:Boolean;如果該值為True,則TMediaPlayer會(huì)根據(jù)Mode屬性返回的當(dāng)前工作狀態(tài)和DeviceType屬性返回的當(dāng)前打開的多媒體設(shè)備類型,決定并設(shè)置每個(gè)按鈕當(dāng)前是否處于可用狀態(tài)。它的優(yōu)先級(jí)比EnabledButtons屬性高。如果該值為False,則不會(huì)進(jìn)行上述操作,必須通過EnabledButtons屬性來設(shè)置哪些按鈕可用而哪些不能。2)AutoOpen:該屬性指定當(dāng)程序運(yùn)行時(shí),TMediaPlayer是否自動(dòng)打開。聲明:propertyAutoOpen:Boolean;如果該值為True,當(dāng)播放器窗口被創(chuàng)建時(shí),TMediaPlayer就會(huì)嘗試打開由DeviceType屬性(如果該屬性設(shè)置為dtAutoSelect,則根據(jù)FileName屬性)指定的多媒體設(shè)備。如果打開失敗,則會(huì)產(chǎn)生一個(gè)EMCIDeviceError類型的異常,錯(cuò)誤類型號(hào)將存入Error屬性,而相應(yīng)的錯(cuò)誤提示信息則存入ErrorMessage屬性中。如果該值為False,則必須調(diào)用Open方法才能打開多媒體設(shè)備。3)AutoRewind:該屬性指定TMediaPlayer是否具有自動(dòng)返回功能。聲明:propertyAutoRewind:Boolean;如果該值為True,并且當(dāng)前播放位置已處于多媒體文件結(jié)尾處,則在播放或錄制之前將自動(dòng)返回到多媒體文件的開始處。如果該值為False,用戶必須單擊Prev按鈕或在程序代碼中調(diào)用Previous方法才能返回到多媒體文件開始處。但是,如果指定了StartPos或EndPos屬性值,或者是多媒體文件是軌道格式,則該屬性設(shè)置在播放和錄制時(shí)無效。4)Capabilities:該屬性是一個(gè)只讀的集合屬性,用于返回設(shè)備當(dāng)前的可操作狀態(tài)。聲明:typeTMPDevCaps=(mpCanStep,mpCanEject,mpCanPlay,mpCanRecord,mpUsesWindow);TMPDevCapsSet=setofTMPDevCaps;property:Capabilities:TMPDevCapsSet;各值所表示意義如表10-6:表10-6設(shè)備狀態(tài)取值及意義5)DeviceID:該屬性為運(yùn)行時(shí)只讀型,返回當(dāng)前打開設(shè)備的識(shí)別號(hào)。如果沒有設(shè)備被打開,則為0。聲明:propertyDeviceID:Word;6)DeviceType:該屬性用來指定要打開的多媒體設(shè)備類型。聲明:typeTMPDeviceTypes=(dtAutoSelect,dtAVIVideo,dtCDAudio,dtDAT,dtDigitalVideo,dtMMMovie,dtOther,dtOverlay,dtScanner,dtSequencer,dtVCR,dtVideodisc,dtWaveAudio);propertyDeviceType:TMPDeviceTypes;默認(rèn)值是dtAutoSelect,表示根據(jù)FileName屬性指定的多媒體文件擴(kuò)展名來自動(dòng)識(shí)別設(shè)備類型。通常每種文件擴(kuò)展名關(guān)聯(lián)一種設(shè)備類型。此時(shí),如果沒有設(shè)備類型與該類型文件相關(guān)聯(lián),則必須要在DeviceType屬性中指定正確的特定設(shè)備類型。設(shè)備類型的可能取值及意義如下表10-7:表10-7可選的設(shè)備類型列表7)Display:該屬性用來指定TMediaPlayer用來顯示輸出的組件,如窗體或面板。默認(rèn)值為nil,表示程序自已創(chuàng)建輸出窗口。聲明:propertyDisplay:TWinControl;8)EnabledButtons:該屬性是一個(gè)按鈕類型值的集合,用來指定TMediaPlayer控制面板上的播放控制按鈕哪些有效可用,哪些是無效不可用的(灰色顯示)。默認(rèn)情況下所有按鈕都可用。聲明:typeTMPBtnType=(btPlay,btPause,btStop,btNext,btPrev,btStep,btBack,btRecord,btEject);TButtonSet=setofTMPBtnType;propertyEnabledButtons:TButtonSet;類型值對(duì)應(yīng)的按鈕及功能見表10-5。9)VisibleButtons:該屬性定義TMediaPlayer控制面板上顯示的按鈕集合。類型值不包含在該集合里的對(duì)應(yīng)按鈕不出現(xiàn)在播放器面板上。TMediaPlayer組件剛添加到窗體時(shí),所有按鈕都是可見的。聲明:propertyVisibleButtons:TButtonSet;10)FileName:該屬性指定要打開或保存的多媒體文件的文件名。聲明:propertyFileName:string;11)Length:該屬性返回已打開多媒體文件的長度,通常以TimeFormat屬性指定格式的時(shí)間表示。聲明:propertyLength:Longint;12)Frame:該屬性指定快進(jìn)或后退時(shí)的步進(jìn)幅度(幀數(shù)),即每次操作的移動(dòng)長度占多媒體文件總長度的百分比。默認(rèn)值為10,表示每次移動(dòng)文件長度10%的位置。聲明:propertyLength:Longint;幀的定義根據(jù)設(shè)備類型有所不同。對(duì)于視頻而言,一幀通常指一幅靜止的畫面。13)Mode:該屬性返回多媒體設(shè)備當(dāng)前所處的操作狀態(tài)。聲明:typeTMPModes=(mpNotReady,mpStopped,mpPlaying,mpRecording,mpSeeking,mpPaused,mpOpen);propertyMode:TMPModes;其可能值的意義如表10-8:表10-8設(shè)備狀態(tài)列表

14)StartPos和EndPos:這兩個(gè)屬性分別用來指定在已打開的多媒體文件內(nèi),進(jìn)行播放或錄制的起始及結(jié)束位置,用由TimeFormat屬性指定格式的時(shí)間表示。它們的值在設(shè)定之后的播放或錄制操作中有效。設(shè)定其值,不影響多媒體文件的當(dāng)前位置(Position屬性值)。聲明:propertyStartPos:Longint;propertyEndPos:Longint;15)Position:該屬性標(biāo)記已打開多媒體文件的當(dāng)前位置,用由TimeFormat屬性指定格式的時(shí)間表示。聲明:propertyPosition:Longint;文件剛打開時(shí),該值默認(rèn)為文件的起始位置。如果設(shè)備支持多軌道格式,則默認(rèn)位于第一條軌道的起始處。16)TimeFormat:該屬性指定描述多媒體文件長度的時(shí)間格式。聲明:typeTMPTimeFormats=(tfMilliseconds,tfHMS,tfMSF,tfFrames,tfSMPTE24,tfSMPTE25,tfSMPTE30,tfSMPTE30Drop,tfBytes,tfSamples,tfTMSF);propertyTimeFormat:TMPTimeFormats;時(shí)間由4個(gè)字節(jié)組成,各個(gè)字節(jié)在不同格式時(shí)意義不同,其對(duì)應(yīng)關(guān)系見表10-9:表10-9可選的時(shí)間格式及表示17)Tracks:該屬性返回已打開的多媒體設(shè)備可供有效播放的軌道條數(shù)。該屬性對(duì)于不是采用軌道格式的多媒體設(shè)備無定義。聲明:propertyTracks:Longint;2.TMediaPlayer的常用方法1)AutoButtonSet:該方法當(dāng)AutoEnabl

溫馨提示

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

評(píng)論

0/150

提交評(píng)論