網絡螞蟻這個軟件一定不會陌生,它的下載速度,斷點續傳的功能都給我們留下了深刻的印象,同時它的軟件界面也是相當棒的。在NetAnt的1.23版中,當下載任務完成或出錯時,在主窗口的中央會以動畫的方式展開一個窗口,報告當前下載的狀況;當用戶關閉窗口時,窗口又以收縮的方式關閉起來。那麼這個動畫窗口是怎樣實現的呢?本例就來討論一下在Visual C++中如何實現這種動畫窗口。
一、 實現方法
要實現這種動畫窗口的編程效果,主要用到WindowsAPI中的AnimateWindow()函數,通過在窗口的創建或消毀過程中調用該函數,來實現開啟和關閉程序時達到所希望的動畫窗口效果。AnimateWindow()函數所提供的動畫效果十分豐富,我們可以在自己的程序中選擇各種不同的動畫效果,增強程序的趣味性。為使讀者對AnimateWindow函數有一個基本了解,我們先對該函數做一個簡單介紹,該函數的原型為:
BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWord dwFlags)
該函數能在顯示與隱藏窗口時產生兩種特殊類型的動畫效果:滾動動畫和滑動動畫。如果函數成功,返回值為非零;如果函數失敗,返回值為零。在下列情況下函數將失敗:窗口使用了窗口邊界、窗口已經可見仍要顯示窗口、窗口已經隱藏仍要隱藏窗口。函數參數hWnd指定產生動畫的窗口句柄;參數dwTime指明動畫持續的時間(以微秒計),完成一個動畫的標准時間為200微秒;參數dwFags指定動畫類型。這個參數可以是一個或多個下列標志的組合:
AW_SLIDE:使用滑動類型。缺省則為滾動動畫類型。當使用AW_CENTER標志時,這個標志就被忽略;
AW_ACTIVATE:激活窗口,在使用了AW_HIDE標志後不能使用這個標志;
AW_BLEND:實現淡出效果。只有當hWnd為頂層窗口的時候才可以使用此標志;
AW_HIDE:隱藏窗口,缺省則顯示窗口;
AW_CENTER:若使用了AW_HIDE標志,則使窗口向內重疊,即收縮窗口,若未使用AW_HIDE標志,則使窗口向外擴展,即展開窗口;
AW_HOR_POSITIVE:自左向右顯示窗口,該標志可以在滾動動畫和滑動動畫中使用,當使用AW_CENTER標志時,該標志將被忽略;
AW_VER_POSITIVE:自頂向下顯示窗口,該標志可以在滾動動畫和滑動動畫中使用,當使用AW_CENTER標志時,該標志將被忽略;
AW_VER_NEGATIVE:自下向上顯示窗口,該標志可以在滾動動畫和滑動動畫中使用,當使用AW_CENTER標志時,該標志將被忽略;
二、 編程步驟
1、 啟動Visual C++6.0,生成一個單文檔視圖結構的應用程序,程序命名為"AnmiateWindow";
2、 使用Class Wizard在CMainFrame類中增加WM_CLOSE消息處理函數;
3、 添加代碼,編譯運行程序;
三、 程序代碼
////////////////////////////////////////////////////
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD WS_VISIBLE
CBRS_TOP CBRS_GRIPPER CBRS_TOOLTIPS CBRS_FLYBY
CBRS_SIZE_DYNAMIC) !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbarn");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) !m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status barn");
return -1; // fail to create
}
// TODO: Delete these three lines if you don’t want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
CenterWindow();//使窗口運行時居於屏幕正中央
AnimateWindow(GetSafeHwnd(),500,AW_CENTER);//動畫方式打開窗口
return 0;
}
void CMainFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
AnimateWindow(GetSafeHwnd(),500,AW_CENTER AW_HIDE);
//在窗口關閉時,同樣以動畫的方式結束
CFrameWnd::OnClose();
}
void CMainFrame::OnUpdateFrameTitle(BOOL Nada)
{
//本函數用於修改窗口標題欄
CString csAppName;
csAppName.Format(AFX_IDS_APP_TITLE);
SetWindowText("Visual C++6.0編程序實例");
}
四、小結
上面我們使用API函數實現了窗口的動態彈出與彈入,還有一種辦法可以達到同樣的效果,就是使用定時器,定時修改一個矩形尺寸的大小,然後用MoveWindow ()函數將當前窗口移動到該矩形位置上顯示。有興趣的讀者朋友可以按照這個思路動手實驗一下。