比如,我们界面上有两个编辑框Edit1,Edit2。现在要求鼠标点Edit1时,立即产生一组不断变化缩小的矩形框(框形),飞向Edit2。当到达Edit2的中部是最小的而且自动消失。
    这是一个界面的特效功能。我实现不了。请大家帮我。哪位朋友能有相关的代码给我一下。

解决方案 »

  1.   

    我写个试验一下,怎么说咱也是Flash出来的人啊
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Edit2: TEdit;
        Edit3: TEdit;
        Edit4: TEdit;
        Edit5: TEdit;
        Edit6: TEdit;
        Edit7: TEdit;
        Edit8: TEdit;
        procedure FormCreate(Sender: TObject);
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure Edit1Click(Sender: TObject);
      private
        procedure DrawShape(Cnvs: Tcanvas; TopLeft, BottomRight: TPoint; AMode: TPenMode);
        procedure Wave(Cnvs: Tcanvas; TopLeft, BottomRight: TPoint; Step, TimeDelay: integer);
        procedure FlyWave(Cnvs: Tcanvas; O1, O2: TPoint; Width, Height: integer; Step, TimeDelay: integer);
        procedure FlyBtwnEdit(FrmEdit, T0Edit: TEdit; Step, TimeDelay: Integer);
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1             : TForm1;
      Scrn_Rect         : TCanvas;
      PenColor          : TColor;
    implementation{$R *.dfm}procedure Delay(msec: single);
    //延时函数,msec 为微秒(千分之1秒)
    var
      FirstTickCount    : real;
    begin
      if msec > 0 then
      begin
        FirstTickCount := GetTickCount();
        FirstTickCount := FirstTickCount + msec;
        while FirstTickCount > GetTickCount() do
          Application.HandleMessage;
      end;
    end;procedure TForm1.DrawShape(Cnvs: Tcanvas; TopLeft, BottomRight: TPoint; AMode: TPenMode);
    begin
      with Cnvs do
      begin
        Pen.Mode := AMode;
        Rectangle(TopLeft.X, TopLeft.Y, BottomRight.X, BottomRight.Y);
      end;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Scrn_Rect := TCanvas.Create;
      Scrn_Rect.Handle := GetDC(0);
      PenColor := $0000FFFF;
      Scrn_Rect.Pen.Color := PenColor;
      scrn_Rect.Brush.Style := bsClear;
    end;procedure TForm1.Wave(Cnvs: Tcanvas; TopLeft, BottomRight: TPoint; Step, TimeDelay: integer);
    var dh, dw, dt      : single;
      NowTopLeft, NowBottomRight: Tpoint;begin
      dw := (BottomRight.X - TopLeft.X) / Step;
      dh := (BottomRight.Y - TopLeft.Y) / Step;
      dt := TimeDelay / Step;  NowTopLeft := TopLeft;
      NowBottomRight := BottomRight;  while step > 0 do
      begin
        DrawShape(Cnvs, NowTopLeft, NowBottomRight, pmNotXor);
        delay((dt));
        DrawShape(Cnvs, NowTopLeft, NowBottomRight, pmNotXor);
        NowTopLeft.X := NowTopLeft.X + round(dw / 2);
        NowTopLeft.Y := NowTopLeft.Y + round(dh / 2);
        NowBottomRight.X := NowBottomRight.X - round(dw / 2);
        NowBottomRight.Y := NowBottomRight.Y - round(dh / 2);    dec(step);
        Application.HandleMessage;
      end;
    end;
    procedure TForm1.FlyWave(Cnvs: Tcanvas; O1, O2: TPoint; Width, Height: integer; Step, TimeDelay: integer);
    var dh, dw, dt, dox, doy: single;
      NowTopLeft, NowBottomRight: Tpoint;
    begin
      dw := (Width) / Step;
      dh := (Height) / Step;
      dt := TimeDelay / Step;
      dox := (o1.X - o2.X) / Step;
      doy := (o1.Y - o2.Y) / Step;  NowTopLeft.X := O1.X - round(Width / 2);
      NowTopLeft.Y := O1.Y - round(Height / 2);  NowBottomRight.X := O1.X + round(Width / 2);
      NowBottomRight.Y := O1.Y + round(Height / 2);  delay((dt));
      while step >= 0 do
      begin
        DrawShape(Cnvs, NowTopLeft, NowBottomRight, pmNotXor);
        delay((dt));
        DrawShape(Cnvs, NowTopLeft, NowBottomRight, pmNotXor);    NowTopLeft.X := NowTopLeft.X - round(dox - dw / 2); // dw / 2 +
        NowTopLeft.Y := NowTopLeft.Y - round(doy - dh / 2); //  dh / 2 +
        NowBottomRight.X := NowBottomRight.X - round(dox + dw / 2); // dw / 2 +
        NowBottomRight.Y := NowBottomRight.Y - round(doy + dh / 2); //     dh / 2 +    dec(step);
        Application.HandleMessage;
      end;
    end;procedure TForm1.FlyBtwnEdit(FrmEdit, T0Edit: TEdit; Step, TimeDelay: Integer);
    var o1, o2          : tpoint;
    begin
      o1.X := FrmEdit.Left + round(FrmEdit.Width / 2);
      o1.Y := FrmEdit.Top + round(FrmEdit.Height / 2);
      o2.X := T0Edit.Left + round(T0Edit.Width / 2);
      o2.Y := T0Edit.Top + round(T0Edit.Height / 2);
      o1 := clienttoscreen(o1);
      o2 := clienttoscreen(o2);
      FlyWave(Scrn_Rect, o1, o2, T0Edit.Width, T0Edit.Height, Step, TimeDelay);
    end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      Scrn_Rect.Free;
    end;procedure TForm1.Edit1Click(Sender: TObject);
    var FrmEdit, ToEdit : TEdit;
      i                 : integer;
    begin
      if Screen.ActiveControl is TEdit then
      begin
        FrmEdit := TEdit(Screen.ActiveControl);
        for i := 0 to ComponentCount - 2 do
        begin
          if (Components[i] is TEdit) then
            if TEdit(Components[i]).taborder = FrmEdit.taborder + 1 then
            begin
              ToEdit := TEdit(Components[i]);
              break;
            end;
        end;
        if i = ComponentCount - 1 then ToEdit := Edit1;
        FlyBtwnEdit(FrmEdit, ToEdit, 10, 100);
      end;
    end;end.写完了,代码乱了点,你看看吧,不仅能画矩形,只要改改drawshape函数,椭圆,圆矩形都能画
      

  3.   

    非常谢谢flashtong(阿木) 。