繪圖需要有紙、畫筆、畫刷; Delphi 有 Canvas、Pen、Brush.
Canvas :就是畫布, 譬如窗體的 Canvas 屬性, 就是窗體的畫布;
Pen :是畫筆, 可以設置筆色、筆寬等等;
Brush: 是畫刷, 可以設置填充顏色等等.
--------------------------------------------------------------------------------
//舉例:
{繪制直線}
procedure TForm1.Button1Click(Sender: TObject);
begin
Canvas.Pen.Color := clRed; {設置畫筆顏色}
Canvas.Pen.Width := 2; {設置畫筆寬度}
Canvas.MoveTo(10,10); {直線起點}
Canvas.LineTo(100,100); {直線終點}
{這裡的 Canvas 是簡寫, 也可以寫做: Self.Canvas 或 Form1.Canvas }
end;
{矩形填充}
procedure TForm1.Button2Click(Sender: TObject);
begin
Canvas.Brush.Color := clYellow; {設置畫刷顏色, 也就是填充色}
Canvas.FillRect(ClientRect); {填充窗體客戶區}
end;
最好用 TPaintBox 並在其 OnPaint 事件中繪圖。而不是在Image控件中Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
--------------------------------------------------------------------------------
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 輕便些.