闲谈Graphics单元
2005-03-08 11:49
155 查看
本文中如果有错误的地方,您可以通过[/i]ttch007@sina.com[/i]联系笔者,[/i] [/i]同时希望能与大家共同讨论[/i]
[/i]
VCL中的图象显示核心单元Graphics,其中主要把图象对象分为2大类TGriphics TGriphicsObject,两者从字面意义讲一个是图象体,一个是图象工具。打个比喻一个是绘图体,一个是绘图工具体。接下来我们具体了解以下这个单元是怎么封装的这个单元。
TFont,TPen,TBrush[/b]这[/b]3[/b]个对象组成了[/b]TCanvas[/b][/b][/b]你可以看到图1,TFont,TPen,TBrush 3个类都来之TGriphicsObject,而TGriphicsObject是个有存储能力的持久类。了解TCanvas的基础是了解这3个对象,他们提供了TCanvas基本的功能和数据,TCanvas是靠这3个对象的数据开始运做的。在TFont,TPen,TBrush都做了什么来提供给TCanvas的数据的?
带这个疑问我们看看TFont,TBrush,TPen
我们首先看看TGraphicsObject提供了给这3个类 TGraphicsObject = class(TPersistent) private FOnChange: TNotifyEvent; FResource: PResource; FOwnerLock: PRTLCriticalSection; protected procedure Changed; dynamic; procedure Lock; procedure Unlock; public function HandleAllocated: Boolean; property OnChange: TNotifyEvent read FOnChange write FOnChange; property OwnerCriticalSection: PRTLCriticalSection read FOwnerLock write FOwnerLock; end;从上面我们可以看到 TGraphics提供了标准的改变事件函数指针,Resource指针,临界区锁定功能,那么Resource指针指向的结构都有什么?
PResource = ^TResource; TResource = record Next: PResource; RefCount: Integer; Handle: THandle; HashCode: Word; case Integer of 0: (Data: TResData); 1: (Font: TFontData); 2: (Pen: TPenData); 3: (Brush: TBrushData); end;上面就是他的结构体他是一个HASH表,数据结构的东西就不讲,我们跳过,你可以看到其中还有4个结构体,那里就有我们这个单元要谈的3个类的属性存储结构,按号入位,大家都找到了吧。我们跳过3个结构体,直接讲解下面的机制。我们知道了TGraphics提供了给这3个类最基本的功能,那么我们接下来要知道这3个类是如何被建立和设定属性的方式。TResourceManager是一个建立实际数据空间的类,他主要为这3个类提供真正的数据空间。(他和WINDOWS没有关系)这样讲也许有人不会他理解,我画了一个图,大家可以在压缩包中找到相应的图片(ThreeClass.png)里面有详细的介绍.
先到这 先是简单的介绍一下机制,以后再谈其中的具体操作细节
[/i]
VCL中的图象显示核心单元Graphics,其中主要把图象对象分为2大类TGriphics TGriphicsObject,两者从字面意义讲一个是图象体,一个是图象工具。打个比喻一个是绘图体,一个是绘图工具体。接下来我们具体了解以下这个单元是怎么封装的这个单元。
TFont,TPen,TBrush[/b]这[/b]3[/b]个对象组成了[/b]TCanvas[/b][/b][/b]你可以看到图1,TFont,TPen,TBrush 3个类都来之TGriphicsObject,而TGriphicsObject是个有存储能力的持久类。了解TCanvas的基础是了解这3个对象,他们提供了TCanvas基本的功能和数据,TCanvas是靠这3个对象的数据开始运做的。在TFont,TPen,TBrush都做了什么来提供给TCanvas的数据的?
带这个疑问我们看看TFont,TBrush,TPen
我们首先看看TGraphicsObject提供了给这3个类 TGraphicsObject = class(TPersistent) private FOnChange: TNotifyEvent; FResource: PResource; FOwnerLock: PRTLCriticalSection; protected procedure Changed; dynamic; procedure Lock; procedure Unlock; public function HandleAllocated: Boolean; property OnChange: TNotifyEvent read FOnChange write FOnChange; property OwnerCriticalSection: PRTLCriticalSection read FOwnerLock write FOwnerLock; end;从上面我们可以看到 TGraphics提供了标准的改变事件函数指针,Resource指针,临界区锁定功能,那么Resource指针指向的结构都有什么?
PResource = ^TResource; TResource = record Next: PResource; RefCount: Integer; Handle: THandle; HashCode: Word; case Integer of 0: (Data: TResData); 1: (Font: TFontData); 2: (Pen: TPenData); 3: (Brush: TBrushData); end;上面就是他的结构体他是一个HASH表,数据结构的东西就不讲,我们跳过,你可以看到其中还有4个结构体,那里就有我们这个单元要谈的3个类的属性存储结构,按号入位,大家都找到了吧。我们跳过3个结构体,直接讲解下面的机制。我们知道了TGraphics提供了给这3个类最基本的功能,那么我们接下来要知道这3个类是如何被建立和设定属性的方式。TResourceManager是一个建立实际数据空间的类,他主要为这3个类提供真正的数据空间。(他和WINDOWS没有关系)这样讲也许有人不会他理解,我画了一个图,大家可以在压缩包中找到相应的图片(ThreeClass.png)里面有详细的介绍.
先到这 先是简单的介绍一下机制,以后再谈其中的具体操作细节
相关文章推荐
- Graphics 单元中的类
- Graphics 单元下的公用函数目录
- graphics单元的几个图像函数
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数005·graphics-obj,基本绘图单元,包括线段、矩形、椭圆、圆形
- 在Linux平台如何编译单元测试的代码(转)
- Winform中利用Graphics 画折线图
- 为Python2.6的单元模块unittest做hack
- ArcGIS Silverlight API 扩展:将GraphicsLayer/FeatureLayer导出为ShapeFile
- Android ApiDemo 笔记(一)Content与Graphics
- “当前线程不在单线程单元中,因此无法实例化 ActiveX 控件……” 的解决办法
- ARM学习笔记--内存管理单元MMU
- VSU(虚拟交换单元)组网提升网络可用性
- iOS学习笔记之CoreGraphics框架
- 常见的C#单元测试工具介绍
- ArcGIS Server Flex实现GraphicsLayer上画点、线、面
- 在Windows Server 2003 、Windows XP或者Windows 2000中安装 SQL SERVER 2008 开发版和企业版时,会遇到“性能计数器注册表配置单元一致性”检查失败
- 用Html5制作的一款数学教学程序Function Graphics(绘制函数图的程序)
- GDI+最佳实践及改善性能说明(来自Graphics Programming with GDI+)
- Interactive 3D Graphics-Lesson2 Problem Set
- Jcms模板设参时候,设置完某个标签单元后,模板刷新出现500错误问题解决方法。