zoukankan      html  css  js  c++  java
  • 实现一个模拟动画显示控件

    先看看实现的效果如:

        首先,我们来分析一下,这个控件的继承方式,这个根据个人需要,如果仅仅作为显示使用,不涉及到太多的消息以及事件响应消息的可以从TGraphicControl继承来实现,因为TGraphicControl就是专门用来实现仅仅显示效果的控件的,他的特性,我在前面的概述中有提到过,不明白的可以返回去查看;如果需要处理一些特殊消息以及句柄的处理的,那么请从TWinControl继承来实现。这里我选择直接从TGraphicControl来实现!

       其次,这个动画效果,我们通过什么来实现!这个很容易想到TImagelist,Delphi自己带有的一组图片集合控件,通过这个图片集合,我们可以设定一个延迟时间,每隔多少时间就从ImageList中取得一幅图片然后刷新到客户面前!那么不断的执行这个过程,不就实现了动画效果了哈!

      那好,现在就开始编写代码,在上回我们的控件包中添加一个新的单元,我取名为DxAnimateControl,然后打一个框架如下

    复制代码
    unit DxAnimateControl;

    interface
    uses
    Windows,SysUtils, Classes, Controls,Graphics,ImgList;

    type
    TDxAnimateControl
    = class(TGraphicControl)
    public
    constructor Create(AOwner: TComponent);override;
    end;
    implementation

    { TDxAnimateControl }

    constructor TDxAnimateControl.Create(AOwner: TComponent);
    begin
    inherited;

    end;

    end.
    复制代码

    这个框架中,我什么都没写,上面说了,动画通过一个ImageList来取图,所以新建一个ImageList的开放属性,能够在设计期间使用的,所以放在Published域中

    property ImageList: TImageList;

    另外,我们需要一个变量PicIndex,用来存储当前是哪一帧图片。至于那个取图片的重复过程,可以有两种方法来实现,方法一是采用Delphi自己的时钟控件,方法二是采用线程来模拟时钟的效果。我这里为了简单起见,就只用Delphi自己的时钟来实现了,所以需要一个Timer,然后Timer的时钟过程就是取得新的图片,然后通知刷新,这样显示给咱的就是动画效果了。时钟有了还需要一个属性,用来激活或者停止动画的开关,这个开关属性,咱设置为Active。属性定了,就可以写代码了,先实现ImageList赋值的过程

    复制代码
    procedure TDxAnimateControl.SetImageList(const Value: TImageList);
    begin
    if FImageList <> Value then
    begin
    FImageList :
    = Value;
    if FImageList <> nil then
    begin
    Width :
    = FImageList.Width;
    Height :
    = FImageList.Height;
    end;
    DoTimer(
    nil);
    end;
    end;
    复制代码

    ImageList的设置过程中就会调用一次时钟过程进行一个初始设定,然后我们再看看时钟过程了

    复制代码
    procedure TDxAnimateControl.DoTimer(Sender: TObject);
    begin
    bmp.Canvas.Brush.Color :
    = Color;
    bmp.Canvas.FillRect(ClientRect);
    if (FImageList <> nil) and (FImageList.Count <> 0) then
    begin
    inc(PicIndex);
    if PicIndex > FImageList.Count - 1 then
    PicIndex :
    = 0;
    FImageList.GetBitmap(PicIndex,Bmp);
    end;
    Invalidate;
    end;
    复制代码

    时钟过程就是用来取得图片的一个过程,取到图片了之后就调用Invalidate通知刷新,然后就会触发Paint过程,Paint过程相当简单,仅仅就是将取得的图片绘制出来就完事了

    复制代码
    procedure TDxAnimateControl.Paint;
    begin
    if not bmp.Empty then
    Canvas.CopyRect(ClientRect,bmp.Canvas,bmp.Canvas.ClipRect)
    else inherited;
    end;
    复制代码

    这个代码目前实现的是相当的简单的。希望大家都能够看懂,其他代码请大家先自己补齐完成,等到下次的时候,再给出所有代码,同时请大家思考,除了ImageList的方式之外,还能通过什么方式来实现这个动画效果。下次我就讲通过另外一种方式来实现这个动画效果了!

  • 相关阅读:
    js在线压缩网址
    java 排序
    java访问权限(子类继承父类的方法)
    重庆大学第八届编程大赛初赛1、2题目
    重庆大学oj系统——习题
    种花问题(Can Place Flowers)——两朵花不能相邻
    TFIDF计算
    python自定义聚合函数,merge与transform的区别
    AFM模型 pytorch示例代码
    python计算信息增益
  • 原文地址:https://www.cnblogs.com/key-ok/p/3380826.html
Copyright © 2011-2022 走看看