为什么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 的关系与区别相关推荐

  1. TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别作者:万一 来源:博客园 发布时间:2009-01-09 23:01

    TImage.TPaintBox.TPicture.TBitmap.TCanvas.TGraphic 的关系与区别 作者:万一  来源:博客园  发布时间:2009-01-09 23:01  阅读:3 ...

  2. IPython和Jupyter关系及区别

    IPython和Jupyter关系及区别 pycharm中 terminal和python console的区别? pycharm中 run file in console 什么是 IPython I ...

  3. 图解人工智能机器学习深度学习的关系和区别

    图解人工智能机器学习深度学习的关系和区别,先直观看下图的关系: AI(Artificial Intelligence.人工智能).机器学习(machine learning).深度学习(Deep le ...

  4. Linux 库函数与系统调用的关系与区别

    上周总结了<C 标准库的基础 IO>,其实这些功能函数通过「系统调用」也能实现相应功能.这次文章并不是要详细介绍各系统调用接口的使用方法,而是要深入理解「库函数」与「系统」调用之间的关系和 ...

  5. CPU的核心数、线程数的关系和区别

    我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级.CPU从早期的单核,发展到现在的双核,多核.CPU除了核心数之外,还有线程数之说,下面笔者就来解释一下CPU的核心数与 ...

  6. SpringBoot与SpringCloud的关系与区别

    一.SpringBoot和SpringCloud简介 1.SpringBoot:是一个快速开发框架,通过用MAVEN依赖的继承方式,帮助我们快速整合第三方常用框架,完全采用注解化(使用注解方式启动Sp ...

  7. Table中Family和Qualifier的关系与区别(转载)

    Table中Family和Qualifier的关系与区别 就像用MySQL一样,我们要做的是表设计,MySQL中的表,行,列的在HBase已经有所区别了,在HBase中主要是Table和Family和 ...

  8. java map与set的区别_java 集合(list,set,map)三者之间的关系和区别

    原 java 集合(list,set,map)三者之间的关系和区别 一:先上一张关系图,让大家看的更明白. 备注:其中红色部分为实现,其他地方均为接口. 二:各自的特点. List 有序,可重复Arr ...

  9. fsync与fflush的关系和区别

    read/write/fsync与fread/fwrite/fflush的关系和区别 read/write/fsync: linux底层操作: 内核调用, 涉及到进程上下文的切换,即用户态到核心态的转 ...

最新文章

  1. 为什么体制内外永远在互相羡慕着?
  2. UA MATH571A 多元线性回归IV 广义线性模型
  3. 把所有的谎言献给你β(找规律数学题)
  4. python求乘积内建函数_Python中的内建函数(Built_in Funtions)
  5. 知道这些性能优化手段,工资起码提升一倍
  6. mysql8和5.7区别_mysql8.0与mysql5.7安全加密小差别
  7. 基于java的社团管理系统设计(含源文件)
  8. 性能测试:基础(1)
  9. 设置php语言,PHP语言之php-fpm 基本设置与启动
  10. 线性代数同济第六版_线性代数不考内容+大纲等
  11. 计算机绘图cad期末考试试题,机械CAD/CAM期末考试复习资料[机械CAD/CAM]
  12. java合成图片并添加文字
  13. 计算机考研复习资料推荐
  14. 回顾使用云桌面的那些经验
  15. 开一间蜜雪冰城能挣多少钱?
  16. C语言那些事之脉冲丢包率检测
  17. Git使用教程(5)-Git常用命令
  18. mipi传输距离3米_蓝牙网关有效传输距离是多少?
  19. 常用ftp服务器资源
  20. 人民币大小写转换工具类

热门文章

  1. go 监测tcp 连接断开_优化ngrok的tcp连接
  2. [Ext JS 7]7.6 内存泄露及处理
  3. android执行命令行取得结果,Android调用shell脚本并取得输出
  4. mysql dnslog_渗透技巧:使用dnslog加快盲注速度 · C1imber’s Blog
  5. Python 将输出内容保存在text文件中
  6. 布林通道参数用20还是26_布林通道(BOLL)策略的投资效果如何?
  7. ftp ---- 匿名用户(实例配置示例1:匿名用户登录)
  8. java 父类返回子类是咧_【daily】Java泛型 - 返回父类的子类
  9. android 使用pdf文件大小,Android 加载PDF文件的使用
  10. java抽象类及其派生类_java抽象类