TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别
为什么80%的码农都做不了架构师?>>>
TGraphic 是 TBitmap 的父类, 很多绘图函数的参数是 TGraphic, 但我们经常给函数的是 TBitmap;
TBitmap 的很多功能都是继承自 TGraphic, 譬如:
Width、Height、LoadFromFile、SaveToFile、LoadFromStream、SaveToStream;
还有 Palette(调色板)、Transparent(是否透明) 等等.
TGraphic 实用举例:
varg: TGraphic;
beging := TBitmap.Create;g.LoadFromFile('c:\temp\test.bmp');Self.Canvas.StretchDraw(ClientRect, g);g.Free;
end;
TCanvas 是一个绘图表面, 像画圆、画方、画笔、画刷等等都是它的功能;
控件的 Canvas 属性就是一个 TCanvas, 譬如:
varcvs: TCanvas;
begincvs := 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 属性, 没有是因为不常用, 如果需要可以这样:
varcvs: TCanvas;
begincvs := 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 也举个例子吧:
varbit: TBitmap;
beginbit := 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 画了个十字图标(显示并保存起来):
varpic: TPicture;
beginpic := 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
TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别相关推荐
- TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别作者:万一 来源:博客园 发布时间:2009-01-09 23:01
TImage.TPaintBox.TPicture.TBitmap.TCanvas.TGraphic 的关系与区别 作者:万一 来源:博客园 发布时间:2009-01-09 23:01 阅读:3 ...
- IPython和Jupyter关系及区别
IPython和Jupyter关系及区别 pycharm中 terminal和python console的区别? pycharm中 run file in console 什么是 IPython I ...
- 图解人工智能机器学习深度学习的关系和区别
图解人工智能机器学习深度学习的关系和区别,先直观看下图的关系: AI(Artificial Intelligence.人工智能).机器学习(machine learning).深度学习(Deep le ...
- Linux 库函数与系统调用的关系与区别
上周总结了<C 标准库的基础 IO>,其实这些功能函数通过「系统调用」也能实现相应功能.这次文章并不是要详细介绍各系统调用接口的使用方法,而是要深入理解「库函数」与「系统」调用之间的关系和 ...
- CPU的核心数、线程数的关系和区别
我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之说,下面笔者就来解释一下CPU的核心数与 ...
- SpringBoot与SpringCloud的关系与区别
一.SpringBoot和SpringCloud简介 1.SpringBoot:是一个快速开发框架,通过用MAVEN依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动Sp ...
- Table中Family和Qualifier的关系与区别(转载)
Table中Family和Qualifier的关系与区别 就像用MySQL一样,我们要做的是表设计,MySQL中的表,行,列的在HBase已经有所区别了,在HBase中主要是Table和Family和 ...
- java map与set的区别_java 集合(list,set,map)三者之间的关系和区别
原 java 集合(list,set,map)三者之间的关系和区别 一:先上一张关系图,让大家看的更明白. 备注:其中红色部分为实现,其他地方均为接口. 二:各自的特点. List 有序,可重复Arr ...
- fsync与fflush的关系和区别
read/write/fsync与fread/fwrite/fflush的关系和区别 read/write/fsync: linux底层操作: 内核调用, 涉及到进程上下文的切换,即用户态到核心态的转 ...
最新文章
- 为什么体制内外永远在互相羡慕着?
- UA MATH571A 多元线性回归IV 广义线性模型
- 把所有的谎言献给你β(找规律数学题)
- python求乘积内建函数_Python中的内建函数(Built_in Funtions)
- 知道这些性能优化手段,工资起码提升一倍
- mysql8和5.7区别_mysql8.0与mysql5.7安全加密小差别
- 基于java的社团管理系统设计(含源文件)
- 性能测试:基础(1)
- 设置php语言,PHP语言之php-fpm 基本设置与启动
- 线性代数同济第六版_线性代数不考内容+大纲等
- 计算机绘图cad期末考试试题,机械CAD/CAM期末考试复习资料[机械CAD/CAM]
- java合成图片并添加文字
- 计算机考研复习资料推荐
- 回顾使用云桌面的那些经验
- 开一间蜜雪冰城能挣多少钱?
- C语言那些事之脉冲丢包率检测
- Git使用教程(5)-Git常用命令
- mipi传输距离3米_蓝牙网关有效传输距离是多少?
- 常用ftp服务器资源
- 人民币大小写转换工具类
热门文章
- go 监测tcp 连接断开_优化ngrok的tcp连接
- [Ext JS 7]7.6 内存泄露及处理
- android执行命令行取得结果,Android调用shell脚本并取得输出
- mysql dnslog_渗透技巧:使用dnslog加快盲注速度 · C1imber’s Blog
- Python 将输出内容保存在text文件中
- 布林通道参数用20还是26_布林通道(BOLL)策略的投资效果如何?
- ftp ---- 匿名用户(实例配置示例1:匿名用户登录)
- java 父类返回子类是咧_【daily】Java泛型 - 返回父类的子类
- android 使用pdf文件大小,Android 加载PDF文件的使用
- java抽象类及其派生类_java抽象类