【读书笔记】【Delphi高手突破】TGraphicControl/TcustomControl 与画布(Canvas)

 控件组织结构图

                   TControl

TGraphicControl      TWinControl

                                TCustomControl

TGraphicControl/TcustomControl 的Canvas属性,基本相似,下面以TGraphicControl说明

1,由TGraphicControl的声明中的

TGraphicControl = class(TControl)
private
FCanvas: TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
protected
procedure Paint; virtual;
property Canvas: TCanvas read FCanvas;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;


FCanvas在TGraphicControl的构造函数中被创建:
constructor TGraphicControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;

end;

其中:

TControlCanvas = class(TCanvas)
private
FControl: TControl;
FDeviceContext: HDC;
FWindowHandle: HWnd;
procedure SetControl(AControl: TControl);
protected
procedure CreateHandle; override;
public
destructor Destroy; override;
procedure FreeHandle;
procedure UpdateTextFlags;
property Control: TControl read FControl write SetControl;
end;

TControlCanvas将Canvas绑定到一个TControl实例上,其内部的FControl指针即指向Canvas所属的TControl实例。

2,TCanvas提供了一个空的虚方法CreateHandle(),这个方法由TControlCanvas中被覆盖重新实现(FControl是TWinControl或其派生类的实例,即控件本身是窗口,则取得该窗口的设备上下文句柄赋给Handle属性;如果FControl非TWinControl或其派生类的实例,即控件本身并非窗口,则将其父窗口的设备上下文句柄赋给Handle。)

3,在WMPaint()方法中,根据接受到的消息的参数所给出的窗口的设备上下文句柄,给Canvas属性的Handle重新赋值,并且调用虚方法Paint()(虚方法Paint()可以被TGraphicCotnrol的派生类所覆盖,重新定义并实现绘制图形、图像的方法)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值