網絡螞蟻 (NetAnt) 1.23 版任務完成/出錯時,主視窗中央以動畫展開/收縮彈窗,體驗極佳。Windows 提供 AnimateWindow API 可零成本實現此效果,支援滾動、滑動、淡入淡出、中心擴展等多種動畫類型。
BOOL AnimateWindow(HWND hWnd, DWORD dwTime, DWORD dwFlags);
| 旗標 | 效果 | 備註 |
|---|---|---|
| AW_SLIDE | 滑動動畫 | 預設為滾動;配合 AW_CENTER 時忽略 |
| AW_ACTIVATE | 動畫結束後激活視窗 | 不可與 AW_HIDE 同用 |
| AW_BLEND | 淡入/淡出 (Alpha 混合) | 僅頂層視窗有效 |
| AW_HIDE | 隱藏視窗 (收縮/淡出) | 預設顯示視窗 |
| AW_CENTER | 中心點擴展/收縮 | 配合 AW_HIDE 為收縮,否則擴展 |
| AW_HOR_POSITIVE | 從左向右滑入 | 配合 AW_SLIDE,AW_CENTER 時忽略 |
| AW_VER_POSITIVE | 從上向下滑入 | 同上 |
| AW_VER_NEGATIVE | 從下向上滑入 | 同上 |
標準動畫時長建議 200~300ms,過長顯拖沓,過短失去動畫感知。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
// ... 標準工具列/狀態列建立代碼 ...
CenterWindow(); // 視窗置中
AnimateWindow(GetSafeHwnd(), 300, AW_CENTER); // 中心擴展展開
return 0;
}
void CMainFrame::OnClose() {
AnimateWindow(GetSafeHwnd(), 300, AW_CENTER | AW_HIDE); // 中心收縮隱藏
CFrameWnd::OnClose(); // 必須最後調用,否則視窗已銷毀動畫失效
}
| 場景 | 旗標組合 | 代碼片段 |
|---|---|---|
| 對話框彈出 (淡入) | AW_BLEND | `AnimateWindow(hDlg, 200, AW_BLEND);` |
| 工具提示滑入 (右下角) | AW_SLIDE | AW_HOR_POSITIVE | AW_VER_POSITIVE | `AnimateWindow(hTip, 150, AW_SLIDE|AW_HOR_POSITIVE|AW_VER_POSITIVE);` |
| 錯誤訊息抖動 | 定時器 + MoveWindow | 見替代方案 |
| 自定義非矩形視窗動畫 | 分層視窗 + UpdateLayeredWindow | 需 WS_EX_LAYERED,配合 Alpha 通道 |
舊版 Windows 或需精細控制軌跡 (如彈性動畫) 時可用:
// 啟動定時器,每 10ms 更新視窗矩形
SetTimer(ID_ANIM_TIMER, 10, NULL);
void CMyWnd::OnTimer(UINT_PTR nID) {
if (nID == ID_ANIM_TIMER) {
static int step = 0;
CRect rect; GetWindowRect(&rect);
// 計算目標矩形 (如從 0 高度漸增至完整高度)
rect.bottom = rect.top + (targetHeight * step / totalSteps);
MoveWindow(&rect);
if (++step > totalSteps) KillTimer(ID_ANIM_TIMER);
}
}
`AnimateWindow` 以極簡 API 賦予應用專業級動畫體驗。合理運用 `AW_CENTER|AW_HIDE` 實現收縮關閉、`AW_BLEND` 實現淡入彈窗,能顯著提升軟體質感。建議動畫時長控制在 200~300ms,並提供系統設定「關閉動畫」選項尊重用戶偏好。