一個優秀的軟體,除了核心功能強大,精美的使用者介面同樣關鍵。以經典下載工具 NetAnt 為例,其任務完成時以動畫方式展開視窗報告狀態,關閉時再以收縮動畫消失,極大增強了互動趣味性。本文將深入解析 Windows API AnimateWindow 的原理、參數詳解、VC++ 實作步驟,以及編譯時常見的「未定義標識符」問題及其解決方案。
函數原型:
BOOL AnimateWindow(HWND hWnd, DWORD dwTime, DWORD dwFlags);
功能: 在視窗顯示或隱藏時產生「滾動」或「滑動」兩大類動畫效果。
參數說明:
| 參數 | 說明 |
|---|---|
hWnd | 要產生動畫的視窗控制代碼。 |
dwTime | 動畫持續時間(毫秒),標準建議值為 200ms。 |
dwFlags | 動畫類型標誌,可組合使用。主要標誌如下: |
dwFlags 常用標誌組合:
AW_SLIDE:滑動效果。預設為滾動效果。若使用 AW_CENTER 則忽略此旗標。AW_ACTIVATE:啟動視窗。不可與 AW_HIDE 同用。AW_BLEND:淡入/淡出效果。僅限頂層視窗使用。AW_HIDE:隱藏視窗。預設為顯示。AW_CENTER:配合 AW_HIDE 為向內收縮;單獨使用為向外展開。AW_HOR_POSITIVE:從左向右展開/滑動。配合 AW_CENTER 時忽略。AW_VER_POSITIVE:從上向下展開/滑動。配合 AW_CENTER 時忽略。AW_VER_NEGATIVE:從下向上展開/滑動。配合 AW_CENTER 時忽略。返回值: 成功非零,失敗為零 (視窗已有邊框、重複顯示/隱藏等情況會失敗)。
MFC AppWizard (exe) -> Single Document -> Finish。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;
// ... 工具列建立代碼 ...
// 在視窗建立完成後,播放「從中心展開」動畫,持續 1000ms
AnimateWindow(GetSafeHwnd(), 1000, AW_CENTER);
return 0;
}
使用 ClassWizard 為 CMainFrame 新增 WM_CLOSE 訊息處理函數:
void CMainFrame::OnClose() {
// 播放「向中心收縮」動畫隱藏視窗
AnimateWindow(GetSafeHwnd(), 1000, AW_HIDE | AW_CENTER);
CFrameWnd::OnClose(); // 必須呼叫基類實作以完成實際關閉
}
直接編譯會報錯:'AnimateWindow' : undeclared identifier、'AW_HIDE' : undeclared identifier 等。
AnimateWindow 定義於 Winuser.h,但受版本巨集 WINVER 控制:
#if (WINVER >= 0x500) // 僅 Windows 2000 (5.0) 以上定義 // ... AnimateWindow 相關定義 ... #endif
VC 6.0 預設 WINVER 為 0x400 (Windows 95/NT 4.0),導致編譯器忽略該函數定義。
方法一:修改專案預編譯標頭 (推薦,不動系統檔)
在 StdAfx.h 較早位置加入:
#undef WINVER #define WINVER 0x500
方法二:修改系統標頭檔 (不推薦,影響範圍大)
編輯 VC 安裝目錄 include/Winuser.h,搜尋 AnimateWindow 兩處定義,將 #if (WINVER >= 0x500) 改為 #if (WINVER >= 0x400)。
AnimateWindow 只需幾行代碼即可賦予程式生動的開關視窗體驗。除 AW_CENTER 外,組合 AW_SLIDE | AW_HOR_POSITIVE 可實現側邊滑入,AW_BLEND 可實現淡入淡出 (需層疊視窗)。開發者可根據介面風格靈活選擇。本文解決的編譯版本限制問題,同樣適用於其他高版本 SDK 函數在 VC 6.0 下的移植場景。