博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别
阅读量:5981 次
发布时间:2019-06-20

本文共 2258 字,大约阅读时间需要 7 分钟。

  hot3.png

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

转载于:https://my.oschina.net/hermer/blog/319261

你可能感兴趣的文章
C/C++基本数据类型
查看>>
C++第八章习题
查看>>
multiset || 线段树 HDOJ 4302 Holedox Eating
查看>>
POJ2115:C Looooops——题解
查看>>
Spring-boot+Mybatis+Maven+MySql搭建实例
查看>>
最基本的js与css 控制弹出层效果
查看>>
第12章线程控制总结
查看>>
网络对抗技术实验一
查看>>
mysql命令大全
查看>>
KVO
查看>>
html----怎样实现元素的垂直居中
查看>>
不显示BOM清单的版本
查看>>
Oracle EBS-SQL (CST-4):检查组织间项目成本.sql
查看>>
PHPMyadmin配置文件详解
查看>>
100C之15:倒底捕了多少鱼?
查看>>
PHP 命名空间
查看>>
层次分析法
查看>>
[转] xgboost
查看>>
ASP.NET一些常用的东西
查看>>
elasticsearch__5__java操作之FilterBuilders构建过滤器Query
查看>>