想讓 WinForms 視窗開啟時從中央展開、關閉時向下滑出?Windows API AnimateWindow(user32.dll)提供豐富的視窗動畫效果,無需複雜的 Timer 與漸層邏輯。本文完整示範 P/Invoke 宣告、旗標組合、開啟/關閉動畫實作與完整程式碼。
using System.Runtime.InteropServices;
public partial class Form1 : Form
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);
// 動畫旗標
private const int AW_HOR_POSITIVE = 0x00000001; // 左→右
private const int AW_HOR_NEGATIVE = 0x00000002; // 右→左
private const int AW_VER_POSITIVE = 0x00000004; // 上→下
private const int AW_VER_NEGATIVE = 0x00000008; // 下→上
private const int AW_CENTER = 0x00000010; // 中央展開/收合
private const int AW_HIDE = 0x00010000; // 隱藏視窗(關閉時使用)
private const int AW_ACTIVATE = 0x00020000; // 啟動視窗
private const int AW_SLIDE = 0x00040000; // 滑動(預設)
private const int AW_BLEND = 0x00080000; // 淡入/淡出
// ...
}
| 組合 | 效果 |
|---|---|
AW_SLIDE | AW_CENTER | 視窗從中央點向四周展開(開啟) |
AW_SLIDE | AW_VER_POSITIVE | AW_HIDE | 視窗從上往下滑入並隱藏(關閉) |
AW_BLEND | 淡入/淡出(不支援 AW_CENTER) |
AW_SLIDE | AW_HOR_POSITIVE | 從左向右滑出 |
public Form1()
{
InitializeComponent();
// 開啟動畫:中央展開,持續 1000ms
AnimateWindow(this.Handle, 1000, AW_SLIDE | AW_CENTER);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
// 關閉動畫:向下滑動隱藏,持續 500ms
AnimateWindow(this.Handle, 500, AW_SLIDE | AW_VER_POSITIVE | AW_HIDE);
}
dwTime:動畫持續毫秒數,太短感覺不到,太長影響使用者體驗,建議 300~1000ms。AW_HIDE 必須搭配關閉動畫,否則視窗動畫結束後仍會顯示。DoubleBuffered = true 或減少動畫時間。FormBorderStyle = None,搭配 AW_BLEND 淡入。AnimateWindow(需設為 WS_EX_LAYERED 或改用 Timer 動畫)。AW_ACTIVATE 確保動畫結束後取得焦點。善用 AnimateWindow,幾行程式碼即可賦予應用程式專業級的視覺回饋,提升使用者體驗。