当前位置: 首页 > ds >正文

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

为什么80%的码农都做不了架构师?>>>   hot3.png


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

http://www.xdnf.cn/news/11626.html

相关文章:

  • 使用ISAPI_Rewrite做实用的重定向
  • 蓝牙(Bluetooth)系统的无线接入
  • 视频网站提取原始地址之二——土豆
  • 数组知识点(详解)
  • JAF简介
  • 「DDD建模」DDD编程方法
  • 国标(GB)安全帽、安全救援头盔标准分享
  • SQL Server 入门学习总结---基础篇
  • jmeter函数---_setProperty 和 _property
  • 电竞玩家的云端盛宴!四大云电脑平台:ToDesk、顺网云、青椒云、极云普惠云实测大比拼...
  • ETCD: request timed out
  • Windows7系统smss.exe文件丢失问题
  • SDL2源代码分析
  • 【芯核架构】听你说你很了解ARM?
  • 汉字编码及区位码查询算法
  • LNK2001:unresolved external symbol,不确定的外部符号。汇总
  • 网络应用服务器配置(IIS和DNS)
  • ultral edit
  • 播放avi视频
  • WriteProcessMemory 函数 (memoryapi.h)
  • cnas实验室搬迁需要注意哪些细节和步骤
  • 计算机三级网络技术备考复习资料
  • 企业信息化建设包括哪些主要内容?帆软如何帮助企业完成数字化转型?
  • SQL Server 分布式数据库的问题和解决方法 msdtc 配置
  • 根据自己真实项目,设计的一个积分系统
  • MIMO基础总结
  • 【Python】——变量名的命名规则(2)
  • border-radius属性值参数详解
  • 烟雾视频资源搜集
  • keypress、keydown、keyup之间的区别与联系