程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi GDI+ 繪圖 (1)

Delphi GDI+ 繪圖 (1)

編輯:Delphi

繪圖需要有紙、畫筆、畫刷; 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 輕便些.


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved