來自:http://blog.csdn.net/lailai186/article/details/8755430
================================================
Delphi TCanvas,TPen,TBrush,TColor 繪圖對象
在Delphi中,專門定義了一組用於繪制圖形的對象和組件,完成一些簡單的圖像功能。利用這些對象、組件的方法,可以方便地繪制各種常用圖形;通過設置它們的屬性,能得到不同風格的圖形。另外,通過對鼠標事件的定義,可以方便設計圖形繪制程序。
(1)TCanvas,TPen,TBrush,TColor對象的方法及屬性;
(2)繪圖功能的實現;
(3)TImage,TPicture,TBitBtn,TBitmap組件的方法及屬性;
(4)圖像觀測及處理。4.4.1 TCanvas——畫布對象
TCanvas對象是一個用於繪圖的組件,Delphi利用這個組件為用戶提供了一個繪制圖形的區域,在這個區域上,程序可實現各種繪圖功能,很多組件(如TImage、TMemo)的Canvas屬性就是TCanvas對象。在組件上繪制圖形就是在組件的畫布上繪制。
TCanvas的Brush、Pen、Font屬性分別是TBrush、TPen、TFont對象,它們用於定義繪制圖形的風格。關於TBrush、TPen對象,后面將詳細介紹。
需要說明的是,Delphi中利用前綴T來標志內部定義的對象,例如TPen代表畫筆對象,TForm則代表窗體對象等。
畫布的筆的位置定義在PenPos屬性中,可用MoveTo方法來移動筆。如果要在畫布上輸出文本,可用Textout方法。
TCanvas對象有很多方法,可完成常用的繪圖功能。方法及功能簡介見表4.2。
表4.2 TCanvas對象的方法
方法 |
說明 |
Arc |
Arc(x1,y1,x2,y2,x3,y3,x4,y4 : Integer); Arc方法在橢圓上畫一段弧,橢圓由(x1,y1)、(x2,y2) 兩點所確定的橢圓決定。弧的起點是橢圓圓周和橢圓中心與(x3,y3)連線的交點。弧矩形終點是橢圓圓周和橢圓中心與(x4,y4)連線的交點以逆時針方向畫弧 |
Chord |
Chord(x1,y1,x2,yx,x3,y3,x4,y4 : Integer); Chord方法連接橢圓上兩點,橢圓由(x1,y1)、(x2,y3) 兩點所確定的矩形決定,(x3,y3)是始點,(x4,y4)是終點 |
Brushcopy |
Brushcopy(const Dest : TRect;Bitmap : TBitmap; const Source TRect;Color : TColor); |
Brushcopy方法把位圖的一部分復制到畫布的某個矩形區域,並用畫筆的當前顏色替換位圖的顏色。參數Dest定義畫布的一個矩形區域,該矩形用以填充位圖,Bitmap定義位圖;Source定義位圖中的矩形區域,該區域上的位圖將被復制;Color定義畫筆中用以替換位圖的顏色 |
|
CopyRect |
CopyRect(Dest:TRect;Canvas:TCanvas; Source TRect); 此方法從另一個畫布對象上復制部分圖像到該畫布。Canvas表示源畫布,Source是源畫布上要復制的圖像區域。Dest表示目標畫布上將接受復制圖像的矩形區域 |
(續表)
方法 |
說明 |
Draw |
Draw(x,y : Integer;Graphic : TGraphic); 此方法在畫布給定的像素點坐標(x,y)處畫Graphic所給的圖像,該圖像可以是位圖、圖標或元位圖 |
Ellips |
Ellips(x1,y1,x2,y2 : Integer); Ellips方法在畫布指定的矩形邊界上畫一個橢圓,(x1,y1)是矩形左上角的像素坐標,(x2,y2)是矩形右下角的像素坐標。如果矩形形成一個區域,則將出現一個橢圓 |
LineTo |
LineTo(x,y : Integer); |
LineTo從當前位置畫一條線至(x,y)所指定的位置,並把筆的位置移至(x ,y) |
|
MoveTo |
MoveTo(x,y : Integer); MoveTo將筆的當前位置設置到點(x,y)處,筆的當前位置在PenPos屬性中,改變筆的當前位置使用MoveTo方法,不要設法改變PenPos的值 |
Die |
Die(x1,y1,x2,y2,x3,y3,x4,y4 : Longint); Die方法繪制橢圓的一部分,橢圓由點(x1,y1),(x2,y2)所確定的矩形所決定,繪制的那部分由橢圓中心到(x3,y3)、(x4,y4)兩點的兩條輻射線所決定 |
Polygon |
Polygon(Points : array of TPrint); Polygon方法在畫布上繪制一系列的點,各點依次連成線,最后將首尾兩點相接形成一個區域,並用當前筆刷填充此區域 |
Polyline |
Polyline(Ports : array of TPort); Polyline方法在畫布上用當前畫筆繪制一系列的點,各點依次連成線 |
StretchDraw |
StretchDraw(Const Rect : TRcct : Graphic : TGraphic); 此方法在Rect參數指定的矩形內畫一圖像。圖像延伸,改變大小以適應矩形 |
Rectangle |
Rectangle(X1,y1,x2,y2 : Integer); Rectangle方法在畫布上用當前畫刷繪制矩形,(x1,y1)是矩形的左上角,(x2,y2)是矩形的右下角 |
DrawFocusRect |
DrawFocusRect(Const Rect : TRect); 此方法繪制一矩形以指示此矩形獲得焦點。此方法是XOR(異或)函數,第二次調用時原有矩形將消失。DrawFocusRect繪制的矩形不能滾動。要實現滾動功能則先調用此方法使矩形消失,待滾動過后重新繪制 |
4.4.2 TPen——畫筆對象
應用程序常用TPen對象在畫布上繪制各種線段,筆的顏色在Color屬性中定義。線段寬度在Width屬性中定義。
1. Style屬性
Style屬性定義了線段的各種類型,見表4.3。
表4.3 Style屬性的取值及含義
Style屬性 |
含義 |
PsSolid |
畫固定線段 |
PsDash |
畫由虛線組成的線段 |
PsDot |
畫由點組成的線段 |
PsDashDot |
畫點划線 |
PsDashDotDot |
畫雙點划線 |
PsClear |
畫看不見的線段 |
PsInsideFrame |
畫邊界的矩形線框 |
2. Mode屬性
Mode屬性定義線段的顏色。可結合當前的顏色、屏幕顏色或它們的反轉值,對線段的顏色重新定義,但不改變Color屬性,詳見表4.4。
表4.4 Mode屬性的取值及含義
Mode屬性 |
像素顏色 |
PmBlack |
黑色 |
PmWhite |
白色 |
PmNop |
不變 |
PmCopy |
使用Color屬性中的顏色 |
PmNotCopy |
筆顏色的反轉值 |
PmMergePenNot |
筆顏色與屏幕顏色反轉值的結合 |
PmNaskNotPen |
屏幕顏色與筆顏色的結合 |
PmMergeNotPen |
屏幕顏色與筆顏色反轉值的結合 |
4.4.3 TBrush——畫刷對象
畫刷對象用以填充圖形,如用畫刷顏色或圖案對矩形或橢圓進行填充。TBrush擁有一個HBrush(畫刷句柄)。
畫刷的顏色定義在Color屬性中。畫刷還有一個Bitmap屬性,該屬性只能在運行時得到,畫刷可使用位圖填充圖形以產生特殊效果。位圖大小為8個像素點高,8個像素點寬。
Style屬性定義了畫刷填充圖形的圖案,如圖4.8所示為Style的取值。
取值 圖案 取值 圖案
圖4.8 畫刷的類型
4.4.4 TColor——顏色對象
TColor類型用於定義對象的顏色。很多組件的顏色屬性就是TColor 類型, 在Graphics單元中TColor定義如下:
TColor = -$7FFFFFFF-1..$7FFFFFFF;
這是一個32位二進制數據。Graphic單元中還定義了一些常用的顏色常量,這些常量或直接映射成系統調色板中最相近的顏色,或映射成Windows控制面板中顏色部分的系統視頻顏色。
直接映射成系統調色板中的顏色有:
ClAqua,CLBlack,ClBlue,ClbkGrray,ClFuchsoa,...,ClYellow
映射程序用4字節的二進制碼來定義顏色,低3位字節代表RGB相應的顏色,如$00FF0000表示純藍,$0000FF00表示純綠,$000000FF表示純紅,$00000000表示黑色,$00FFFFFF表示白色。如果最高位字節是$00,則表示用系統調色板中最相近的顏色;最高位字節是$01,則表示用當前調色板中最相近的顏色匹配;最高位字節是$02,則表示用當前設備描述表中邏輯調色板的次相近顏色匹配。
此外,還有一類顏色,比如:
ClBackground,CLActiveCaption,clInactiveCaption,clMenu…
它們分別表示當前Windows桌面的背景色、當前活動窗體的標題欄的顏色、當前非活動窗體的標題欄顏色以及當前菜單的背景色等。用這些顏色屬性,可以方便地寫出與當前Windows相容的應用程序,而不會出現程序在某個Windows風格中顯得特別扎眼的情況。
用Windows API的SelectPalette函數可創建邏輯調色板,要實現邏輯調色板到硬件調色板的映射,需用RealizePalette函數。