1.TGraphicControl/TcustomControl 与画布(Canvas)
VCL中,TCotnrol之下的组件分两条路各行其道。
一条为图形组件,这类组件并非窗口,职责只在于显示图形、图像,其基类是TGraphicControl;
另一条为窗口组件,这类组件本身是一个Windows窗口(有窗口句柄),其基类是TWinControl。
TGraphicControl作为显示图形、图像的组件分支,从其开始就提供了一个TCanvas类型的Canvas属性,以便在组件上绘制图形、显示图像。
对于窗口组件的分支,TWinControl并没有提供Canvas属性,而在其派生类TCustomControl才开始提供Canvas属性。
控件类分支
TGraphicControl与TCustomControl的实现都在Controls.pas单元中,它们的声明看上去也是如此相似:
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;
TCustomControl = class(TWinControl)
private
FCanvas: TCanvas;
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
protected
procedure Paint; virtual;
procedure PaintWindow(DC: HDC); override;
property Canvas: TCanvas read FCanvas;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
它们提供了Canvas属性,只不过此时Ca