delphi 仿一下手机端淡入淡出的信息提示框

发布时间 2023-04-25 20:31:16作者: 一曲轻扬

先看效果:

设计界面也很简单:

 

下面这个是个From,不是Frame.把它的边框设置为none,然后position设置在父级中央或者桌面中央,看个人喜欢吧.加个label,弯角搞一搞,其他也搞得好看一点.这里推荐SC组件.然后加个计时器.这里说一下定时器的interval属性,时间越长,越显得卡顿,上面是1000的效果,后来我改成了300,发现就比上面的效果好很多.

按钮的事件也要说一下,显示模式用show就行了,不要用showmodal

uses
  FrmMsg;

procedure TForm1.Button1Click(Sender: TObject);
begin
   var frm:=TuFrmMsg.Create(self); //注意与position配合 
   frm.Show;      //在定时器里释放内存
end;
unit FrmMsg;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, scControls, scGPControls,
  Vcl.ExtCtrls;

type
  TuFrmMsg = class(TForm)
    scGPLabel1: TscGPLabel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
    FStartTime: Cardinal;     //私有变量
    FDuration: Cardinal;      //私有变量
  public
    { Public declarations }
  end;

var
  uFrmMsg: TuFrmMsg;

implementation

{$R *.dfm}

procedure TuFrmMsg.FormCreate(Sender: TObject);
begin
  Timer1.Enabled:=True;
  AlphaBlend := True;
  AlphaBlendValue := 0;
  AnimateWindow(Handle, 200, AW_BLEND);
  FDuration:=5000;      //设置显示时间,这里设置5秒
end;

procedure TuFrmMsg.Timer1Timer(Sender: TObject);
begin
// 计算已经显示的时间
  if GetTickCount - FStartTime >= FDuration then
  begin
    // 如果已经显示了足够长的时间,则关闭窗口
    AlphaBlendValue := 0;
    AnimateWindow(Handle, 200, AW_BLEND or AW_HIDE);
    Timer1.Enabled := False;
    Release;
    self.Free;
  end
  else
  begin
    // 否则,根据已经显示的时间和总显示时间计算透明度
    AlphaBlendValue := MulDiv(GetTickCount - FStartTime, 255, FDuration);
  end;
end;

end.