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 輕便些.