本文中如果有错误的地方,您可以通过ttch007@sina.com联系笔者, 同时希望能与大家共同讨论
VCL中的图象显示核心单元Graphics,其中主要把图象对象分为2大类TGriphics
TGriphicsObject,两者从字面意义讲一个是图象体,一个是图象工具。打个比喻一个是
绘图体,一个是绘图工具体。接下来我们具体了解以下这个单元是怎么封装的这个单元。
TFont,TPen,TBrush这3个对象组成了TCanvas
你可以看到图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)里面有详细的介绍.
先到这 先是简单的介绍一下机制,以后再谈其中的具体操作细节