TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别

作者:万一  来源:博客园  发布时间:2009-01-09 23:01  阅读:3209 次  原文链接   [收藏]  

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

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

  1. java圆和椭圆的关系_圆与椭圆 - brifuture - 博客园

    一个单位圆的方程是 X2 + Y2 = 1,画在坐标系中: 对于圆来说,由于它是高度对称的,旋转属性对它而言意义不大. 在 canvas 画布上绘制一个圆很简单,有两种方法: 1. 使用 html5 ...

  2. 我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园

    我的架构设计~用层关系图说说mvc,mvvm,soa,ddd - 张占岭 - 博客园

  3. TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别

    为什么80%的码农都做不了架构师?>>>    TGraphic 是 TBitmap 的父类, 很多绘图函数的参数是 TGraphic, 但我们经常给函数的是 TBitmap; TB ...

  4. 触发器和java的关系_触发器-1 - java ee spring - 博客园

    ------------------------------------环境代码 create  table student (stuid varchar2(10) not null, stuname ...

  5. 20190313(已解决)对于jsp界面与action界面关系的说明_yingruiyuelin_新浪博客

    1.对于通过可以获得上面的界面,上面红色框所标注的就是从action中传过来的值 传值的条件 1)jsp与action中,在jsp有这样的名字,在action中设定了相应的属相,同时设定了get和se ...

  6. cpu核数和逻辑个数的区别_解释一下CPU的核心数与线程数的关系和区别

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

  7. cookie、session、token、webStorage的关系与区别

    cookie session token sessionStorage localstorage 概念 浏览器里面能永久存储的一种数据,仅仅是浏览器实现的一种数据存储功能 Session 是将会话中产 ...

  8. IPython和Jupyter关系及区别

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

  9. 2.Java中String,StringBuilder以及StringBuffer的关系与区别

    String     StringBuffer     StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...

最新文章

  1. 美团分布式ID生成服务LeafCode
  2. NSInteger与int的区别
  3. 使用 python 获取 httpd 程序所占用物理内存
  4. 负样本的艺术,再读Facebook双塔向量召回算法
  5. XCTF WEB disabled_button
  6. Java Singleton类中的线程安全性的示例代码
  7. 用Instant client批量安装Oracle客户端-安装配置
  8. Java中方法的重载(overload)与重写/覆写(override)
  9. [AAAI18]面向序列建模的元多任务学习
  10. 零基础怎么开启编程之路 -(第1期)
  11. 序列最小最优化算法(SMO)
  12. SpringCloud常见面试题总结二
  13. 教你如何使用ip地址进行高精度定位
  14. PCWorld评出的2010年世界杀毒软件排名
  15. 小米 pro 笔记本拆机-加固态
  16. 网页转圈打不开服务器,打不开网页怎么回事
  17. 变限积分性质的总结笔记
  18. Win10 网络连接处空白什么都没有,电脑无法上网
  19. 创始人李卉:麦客CRM2.0核心逻辑及其背后的思考
  20. Leetcode 1146

热门文章

  1. PrometheusAlert 多渠道告警通知神器
  2. python2.7中文编码_python2.7
  3. Java常用http请求库
  4. 车辆监控系统使用帮助
  5. 单反相机快门速度怎么设置
  6. Appium基础篇14-上下左右滑屏操作swipe方法
  7. 用Babel-cli将ES6转ES5
  8. SpringCloud Alibaba史上最强详解与史上最系统框架搭建
  9. 包装名称,大小依靠主单的字段带过来
  10. GroupDocs.Viewer使用功能总结(下)