Delphi控件开发基础篇

本文介绍了Delphi控件开发的基础知识,从TPaintBox控件的简单绘制功能,到TWinControl类的Windows控件封装,再到TCustomControl如何实现自定义和Windows绘制的结合。同时提到了非可视化组件如TComponent的作用。
摘要由CSDN通过智能技术生成

Delphi控件开发基础篇


VCL类继承关系图
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
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值