Delphi控件开发基础篇
Delphi中控件(Component)是依托于 VCL(Visual Component Library)框架而出的。其根类是TComponent。
大凡控件都是从如下几个类继承得来。
TGraphicControl
在实际的界面开发工作中,有许多简单的控件,其本身仅仅是简单的显示一些提示信息,不会完成什么复杂的工作,譬如 TLabel,TPaintBox等控件;而对于win32开发来说,窗口句柄是有限且宝贵的资源,其创建,使用及销毁 成本太高。所以需要一种无句柄的操作模式,且可以自绘的能力, TGraphicControl完全满足这一点。
TGraphicControl的自绘能力由FCanvas负责。并且由WMPaint消息函数调用。各位读者可能会有疑问,TGraphicControl并非Windows窗口类,它怎么能处理消息呢,关于这一点,就不得不提VCL的变态之处,从TComponent 中提供了一套控件自身的消息传递机制—Perform。它扮演者类似于Windows的消息分发函数 DispatchMessage的角色。 最后的绘制工作,落到Paint函数头上,这是个虚拟函数(也算是抽象函数,此处使用了 Spacehold 占位符技术),所以 WMPaint和Paint提供了绘制框架, 此类控件的具体绘制工作,是由后代的Paint函数负责。下面查看一下 TPaintBox的代码,验证一下我们的猜测。
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;
constructor TGraphicControl.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCanvas := TControlCanvas.Create;
TControlCanvas(FCanvas).Control := Self;
end;
destructor TGraphicControl.Destroy;
begin
if CaptureControl = Self then SetCaptureControl(nil);
FCanvas.Free;
inherited Destroy;
end;
procedure TGraphicControl.WMPaint(var Message: TWMPaint);
begin
if Message.DC <> 0 then
begin
Canvas.Lock;
try
Canvas.Handle := Message.DC;
try