转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
组件制作之三(图形控件)         ★★★★

组件制作之三(图形控件)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1961 更新时间:2009/4/23 18:34:08

VCL中的Shape是个很不错的控件,可以选择几种图形,以满足我们的需求,但有时候就是觉得它的可选图形少了一点,比如我们想要一个三角形,它却没有。于是就想到来扩展一下这个控件,名为ShapeEx。其实扩展的功能不多,只是增加了一些图形。而类也并不是继承自TShape,而是继承自TGraphicControl,这样可以让我们彻底看看图形控件的做法。Tshape也是继承自TGraphicControl。而我们的扩展控件功能是基于Shape的扩展,所以当然里面的代码几乎取之TShape,只是加了一些扩展图形的代码,但又有什么关系呢,VCL源码是最好的学习资源,我们何不取之用之。

 

很多东西我们已经在上面说过了,这里不多说了,我要直入图形控件的重点。图形控件不是封装Windows的控件,而是Delphi自己画出来的,那么它肯定有一个画控件的函数。这个函数就是:

Paint;

 看一下VCL源码,可以知道它定义在TGraphicControl。中:

 procedure Paint; virtual;

这是一个虚函数,那么它的实现是怎么样的呢,点击看它的实现如下:

procedure TGraphicControl.Paint;

begin

end;

里面什么码也没有,这个很容易理解,因为它不可能知道他的子类的图形是什么样子的。所以设为虚函数,由它的子类来覆盖它。

 

那么是谁调用了这个函数来引起画控件呢。Windows有一个WM_PAINT;消息,当一切引起重画的条件发生,则会发送这条消息,再看看TGraphicControl,果然有截获这个消息:

procedure WMPaint(var Message: TWMPaint); message WM_PAINT;

在处理函数里面,调用了Paint方法,从而实现了画图形控件可能:

procedure TGraphicControl.WMPaint(var Message: TWMPaint);

begin

  if Message.DC <> 0 then

  begin

    Canvas.Lock;

    try

      Canvas.Handle := Message.DC;

      try

        Paint;   //调用了这个函数来画图形控件

      finally

        Canvas.Handle := 0;

      end;

    finally

      Canvas.Unlock;

    end;

  end;

end;

而它的子类覆盖了Paint函数,所以消息处理函数调用的实际上是某个子类的Paint方法,这个就是多态的应用了,这里不多说。

 

既然Paint函数可以画图形控件,那么它是以什么来画的呢,VCL有一个Canvas类,它就是用这个来画的,在TGraphicControl果然也定义了这个成员:

FCanvas: TCanvas;

property Canvas: TCanvas read FCanvas;

可以看出这是一个只读的成员,因为它不想外界来影响他。

 

好了,一切已经具备了,现在就可以画上去了。源代码有详细解释,这里不多说。

 

ShapeEx中有两个对象属性,为Pen和Brush。对应于他的两个对象成员。设置了这两个属性之后,在对象察看器中就可以展开他们来设置他们的属性了。这个也是对象属性的一般用法。

 

似乎没有什么可说的了,下面看源代码吧,其中也有很详细的说明:

unit shapeExUnit;

 

interface

uses

  SysUtils,Classes,Graphics,Controls,ExtCtrls;

 

type

//定义了几种形状:矩形,正方形,圆角矩形,圆角正方形,椭圆形,圆形,

//增加的图形:横线,坚线,上三角形,菱形

 TShapeType = (stRectangle, stSquare, stRoundRect, stRoundSquare,

    stEllipse, stCircle,stHLine,stVLine,stTriangle,stDiamond);

 

  TShapeEx = class(TGraphicControl)

  private

    FPen: TPen;

    FBrush: TBrush;

    FShape: TShapeType;

    procedure SetBrush(Value: TBrush);

    procedure SetPen(Value: TPen);

    procedure SetShape(Value: TShapeType);

  protected

  //最重要的函数,在父类TGraphicControl中定义的一个

  //虚函数,当得到WM_PAINT消息时,调用该函数引起重画

  //父类是一个空函数,以便TGraphicControl的子类复盖它。

    procedure Paint; override;

  public

    constructor Create(AOwner: TComponent); override;

    destructor Destroy; override;

  published

  //这个函数当图形中的画笔和画刷改变时引起重画,在设计器中最为明显

    procedure StyleChanged(Sender: TObject);

    property Align;

    property Anchors

[1] [2] [3]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台