1. 程式人生 > 其它 >TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的關係與區別

TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的關係與區別

轉自萬一老師的部落格

https://www.cnblogs.com/del/archive/2009/01/09/1373051.html

TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的關係與區別


TGraphic 是 TBitmap 的父類, 很多繪圖函式的引數是 TGraphic, 但我們經常給函式的是 TBitmap;

TBitmap 的很多功能都是繼承自 TGraphic, 譬如:
Width、Height、LoadFromFile、SaveToFile、LoadFromStream、SaveToStream;
還有 Palette(調色盤)、Transparent(是否透明) 等等.

TGraphic 實用舉例:


var
 g: TGraphic;
begin
 g := TBitmap.Create;
 g.LoadFromFile('c:\temp\test.bmp');
 Self.Canvas.StretchDraw(ClientRect, g);
 g.Free;
end;


TCanvas 是一個繪圖表面, 像畫圓、畫方、畫筆、畫刷等等都是它的功能;

控制元件的 Canvas 屬性就是一個 TCanvas, 譬如:


var
 cvs: TCanvas;
begin
 cvs := Self.Canvas;
 cvs.Brush.Color := clYellow;
 cvs.Font.Color := clRed;
 cvs.Font.Name := '宋體'
; cvs.Font.Style := [fsBold]; cvs.Font.Size := 24; cvs.TextOut(10, 10, '萬一的 Delphi 部落格'); end;


有些控制元件沒有直接給 Canvas 屬性, 我們也可以通過 TCanvas 獲取它的繪圖表面;
一切看得見的控制元件都應該有繪圖表面, 不然系統是怎麼畫的?

譬如 TPanel 和 TButton 就沒有 Canvas 屬性, 沒有是因為不常用, 如果需要可以這樣:


var
 cvs: TCanvas;
begin
 cvs := TCanvas.Create;
 cvs.Handle := GetDC(Panel1.Handle);
 cvs.Pen.Width := 2
; cvs.Pen.Color := clRed; cvs.Brush.Color := clYellow; cvs.Rectangle(5, 5, 50, 30); cvs.Free; end;


再說 TBitmap, 它從 TGraphic 繼承, 同時又把 TCanvas 納為自己的屬性;
所以它有了處理圖片和繪圖的雙重功能!

給 TBitmap 也舉個例子吧:


var
 bit: TBitmap;
begin
 bit := TBitmap.Create;
 bit.LoadFromFile('c:\temp\test.bmp');
 bit.Canvas.Brush.Style := bsClear;
 bit.Canvas.Pen.Color := clRed;
 bit.Canvas.Pen.Width := 2;
 bit.Canvas.Ellipse(2, 2, 88, 66);
 Self.Canvas.Draw(0, 0, bit);
 bit.Free;
end;


TPicture 是為了處理更多種格式的圖片(譬如: ico、wmf 等)而存在的;
但它把 TGraphic、TCanvas、TBitmap 的功能通通借用過來, 所以功能更強大.

TPicture 和 TGraphic 重複的功能(譬如: LoadFromFile)都是內部呼叫的 TGraphic;
但如果要給它繪圖, 需要呼叫: TPicture.Bitmap.Canvas.

下面的例子是用 TPicture 畫了個十字圖示(顯示並儲存起來):


var
 pic: TPicture;
begin
 pic := TPicture.Create;
 pic.Bitmap.SetSize(32, 32);
 pic.Bitmap.Canvas.Pen.Color := clRed;
 pic.Bitmap.Canvas.Pen.Width := 8;
 pic.Bitmap.Canvas.MoveTo(0, 16);
 pic.Bitmap.Canvas.LineTo(32, 16);
 pic.Bitmap.Canvas.MoveTo(16, 0);
 pic.Bitmap.Canvas.LineTo(16, 32);

 Self.Canvas.Draw(4, 4, pic.Graphic);
 pic.SaveToFile('c:\temp\test.ico');
 pic.Free;
end;


TImage 則主要是為了顯示圖片, 它主要包含的是 TPicture, 有了 TPicture 就有了上面的一切;
但因它是從 TControl -> TGraphicControl 繼承下來的, 所以它具備了控制元件的基本能力(事件、訊息等等).

TPaintBox 主要用於繪圖, 沒有處理圖片的能力, 所以只包含了 TCanvas;
它也是從 TControl -> TGraphicControl 繼承, 是能夠互動的控制元件了.

很顯然, TImage 比 TPaintBox 的能力強大; 但僅就繪圖來講, 還是 TPaintBox 輕便些.