首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 使用 API 實作 MSN 風格彈出提示視窗:AnimateWindow 打造滑入滑出動畫

     編輯:Delphi

MSN Messenger 的訊息提示視窗從工作列右下角滑出,關閉時滑回,極具辨識度。在 Delphi 中利用 Windows API AnimateWindow 即可輕鬆實現同樣效果,無需複雜的 Timer 控制座標。

核心技術:AnimateWindow API

AnimateWindow(hwnd, dwTime, dwFlags) 參數說明:

  • hwnd:目標視窗控制代碼
  • dwTime:動畫持續時間(毫秒)
  • dwFlags:動畫類型旗標組合

常用旗標:

實作步驟

1. 建立提示視窗表單 (Form2)

  • BorderStyle := bsNone:移除邊框與標題列
  • 放置 Panel (Align=alClient, BevelInner=bvLowered) 作為背景
  • Panel 內自由放置 Label、Image 等顯示訊息內容

2. 重寫 Show / Close 方法整合動畫

unit Unit2;

interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    Image1: TImage;
    Label1: TLabel;
    procedure Label1Click(Sender: TObject);
    procedure Image1Click(Sender: TObject);
  private
  public
    procedure Show; override;
    procedure Close; override;
  end;

var Form2: TForm2;

implementation

procedure TForm2.Close;
begin
  // 向下滑出並隱藏 (AW_VER_POSITIVE + AW_HIDE)
  if not AnimateWindow(Handle, 200, AW_VER_POSITIVE or AW_HIDE) then
    ShowMessage('視窗關閉動畫失敗');
  inherited Close;
end;

procedure TForm2.Show;
begin
  // 設定初始位置:螢幕右下角附近 (需依解析度微調)
  Top := Screen.Height - Height - 50;  // 距離底部 50px
  Left := Screen.Width - Width - 20;   // 距離右側 20px
  
  // 從下向上滑入 (AW_VER_NEGATIVE)
  if not AnimateWindow(Handle, 200, AW_VER_NEGATIVE) then
    ShowMessage('視窗顯示動畫失敗');
  inherited Show;
end;

{$R *.dfm}
end.

3. 主表單 (Form1) 呼叫示範

放置兩個 Button:Button1.Caption := '顯示提示'、Button2.Caption := '關閉提示'

unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
    Button1, Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;
var Form1: TForm1; mesfrm: TForm2;
implementation uses Unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  mesfrm := TForm2.Create(Application);
  mesfrm.Show;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Assigned(mesfrm) then mesfrm.Close;
end;
end.

進階應用建議

  • 自動關閉:在 Form2 中加入 Timer,設定 Interval := 5000,OnTimer 執行 Close。
  • 多訊息佇列:主表單維護訊息佇列,前一個視窗關閉後自動顯示下一個。
  • 點擊穿透/互動:Panel 的 OnClick 可觸發開啟對應聊天視窗或網頁。
  • 高 DPI 適配:使用 Screen.WorkAreaHeight/Width 計算位置,支援多螢幕與縮放。

僅需 20 行核心程式碼,即可打造專業級的桌面通知體驗,極大提升應用程式的現代感與使用者互動品質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
旗標效果
AW_HOR_POSITIVE從左向右滑入
AW_HOR_NEGATIVE從右向左滑入
AW_VER_POSITIVE從上向下滑入
AW_VER_NEGATIVE從下向上滑入(MSN 風格)
AW_HIDE隱藏視窗(搭配方向旗標呈現滑出效果)
AW_BLEND淡入淡出(不支援標題列視窗)