随笔 - 2146  文章 - 19 评论 - 11846 阅读 - 1267万


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


posted on   万一  阅读(16805)  评论(16编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2008-01-09 学习结构[记录]类型(9) - 变体结构
2008-01-09 学习结构[记录]类型(8) - 结构嵌套
2008-01-09 学习结构[记录]类型(7) - 结构也可以有构造函数
2008-01-09 学习结构[记录]类型(6) - 结构的属性
2008-01-09 学习结构[记录]类型(5) - 结构的方法
2008-01-09 学习结构[记录]类型(4) - 结构指针
2008-01-09 学习结构[记录]类型(3) - 结构间的关系


点击右上角即可分享
微信分享提示