當(dāng)你開發(fā)一款年輕人使用的軟件時(shí),肯定想用一點(diǎn)動(dòng)感的特性來吸引他們。比如QQ軟件就有這個(gè)特性,當(dāng)你把它放到桌面邊上時(shí),就會(huì)自動(dòng)隱藏起來,當(dāng)你的鼠標(biāo)放到那里時(shí),就會(huì)自動(dòng)慢慢移動(dòng)出來,副有動(dòng)感的特性,肯定讓年輕人喜歡上它的。還有當(dāng)你開發(fā)軟件時(shí),想先動(dòng)態(tài)地顯示公司的商標(biāo),或者公司的宣傳材料時(shí),就會(huì)使用到閃屏的效果。其實(shí)這兩個(gè)特性都可以使用API函數(shù)AnimateWindow來實(shí)現(xiàn)的,下面就來介紹怎么使用它。
函數(shù)AnimateWindow聲明如下:
#if(WINVER >= 0x0500)
WINUSERAPI
BOOL
WINAPI
AnimateWindow(
__in HWND hWnd,
__in DWORD dwTime,
__in DWORD dwFlags);
#endif /* WINVER >= 0x0500 */
hWnd是窗口的句柄。
dwTime是動(dòng)態(tài)出現(xiàn)的時(shí)間。
dwFlags是顯示效果的標(biāo)志設(shè)置。
AnimateWindow 函數(shù)功能:該函數(shù)能在顯示與隱藏窗口時(shí)能產(chǎn)生特殊的效果。有兩種類型的動(dòng)畫效果:滾動(dòng)動(dòng)畫和滑動(dòng)動(dòng)畫。
函數(shù)原型:BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags);
參數(shù):
hWnd:指定產(chǎn)生動(dòng)畫的窗口的句柄。
dwTime:指明動(dòng)畫持續(xù)的時(shí)間(以微秒計(jì)),完成一個(gè)動(dòng)畫的標(biāo)準(zhǔn)時(shí)間為200微秒。
dwFags:指定動(dòng)畫類型。這個(gè)參數(shù)可以是一個(gè)或多個(gè)下列標(biāo)志的組合。
標(biāo)志描述:
AW_SLIDE:使用滑動(dòng)類型。缺省則為滾動(dòng)動(dòng)畫類型。當(dāng)使用AW_CENTER標(biāo)志時(shí),這個(gè)標(biāo)志就被忽略。
AW_ACTIVE:激活窗口。在使用了AW_HIDE標(biāo)志后不要使用這個(gè)標(biāo)志。
AW_BLEND:使用淡出效果。只有當(dāng)hWnd為頂層窗口的時(shí)候才可以使用此標(biāo)志。
AW_HIDE:隱藏窗口,缺省則顯示窗口。
AW_CENTER:若使用了AW_HIDE標(biāo)志,則使窗口向內(nèi)重疊;若未使用AW_HIDE標(biāo)志,則使窗口向外擴(kuò)展。
AW_HOR_POSITIVE:自左向右顯示窗口。該標(biāo)志可以在滾動(dòng)動(dòng)畫和滑動(dòng)動(dòng)畫中使用。當(dāng)使用AW_CENTER標(biāo)志時(shí),該標(biāo)志將被忽略。
AW_VER_POSITIVE:自頂向下顯示窗口。該標(biāo)志可以在滾動(dòng)動(dòng)畫和滑動(dòng)動(dòng)畫中使用。當(dāng)使用AW_CENTER標(biāo)志時(shí),該標(biāo)志將被忽略。
AW_VER_NEGATIVE:自下向上顯示窗口。該標(biāo)志可以在滾動(dòng)動(dòng)畫和滑動(dòng)動(dòng)畫中使用。當(dāng)使用AW_CENTER標(biāo)志時(shí),該標(biāo)志將被忽略。
AW_HOR_NEGATIVE:自右向左顯示窗口。該標(biāo)志可以在滾動(dòng)動(dòng)畫和滑動(dòng)動(dòng)畫中使用。當(dāng)使用AW_CENTER標(biāo)志時(shí),該標(biāo)志將被忽略。
返回值:如果函數(shù)成功,返回值為非零;如果函數(shù)失敗,返回值為零。在下列情況下函數(shù)將失?。?/span>
窗口使用了窗口邊界;窗口已經(jīng)可見仍要顯示窗口;窗口已經(jīng)隱藏仍要隱藏窗口。若想獲得更多錯(cuò)誤信息,請(qǐng)調(diào)用GetLastError函數(shù)。
備注:可以將AW_HOR_POSITIVE或AW_HOR_NEGTVE與AW_VER_POSITVE或AW_VER_NEGATIVE組合來激活一個(gè)窗口。
可能需要在該窗口的窗口過程和它的子窗口的窗口過程中處理WM_PRINT或WM_PRINTCLIENT消息。對(duì)話框,控制,及共用控制已處理WM_PRINTCLIENT消息,缺省窗口過程也已處理WM_PRINT消息。
速查:WIDdOWS NT:5.0以上版本:Windows:98以上版本;Windows CE:不支持;頭文件:Winuser.h;庫文件:user32.lib。
一、引言
俗話說"佛靠金裝,人靠衣裝",一個(gè)好的軟件如果能配上精美的界面一定會(huì)讓更多的用戶認(rèn)同它。喜歡上網(wǎng)的朋友對(duì)NetAnt(網(wǎng)絡(luò)螞蟻)這個(gè)軟件一定不會(huì)陌生,它的下載速度,斷點(diǎn)續(xù)傳的功能都給我們留下了深刻的印象,同時(shí)它的軟件界面也是相當(dāng)棒的。在NetAnt的1.23版中,當(dāng)下載任務(wù)完成或出錯(cuò)時(shí),在主窗口的中央會(huì)以動(dòng)畫的方式展開一個(gè)窗口,報(bào)告當(dāng)前下載的狀況;當(dāng)用戶關(guān)閉窗口時(shí),窗口又以收縮的方式關(guān)閉起來。那么這個(gè)動(dòng)畫窗口是怎樣實(shí)現(xiàn)的呢?下面我們就來討論一下在VC中如何實(shí)現(xiàn)這種動(dòng)畫窗口。
二、編程原理
要實(shí)現(xiàn)這種動(dòng)畫窗口的編程效果,主要用到Windows API中的AnimateWindow函數(shù),通過在窗口的創(chuàng)建或消毀過程中運(yùn)用該函數(shù),來實(shí)現(xiàn)開啟和關(guān)閉程序時(shí)達(dá)到所希望的動(dòng)畫窗口效果。AnimateWindow函數(shù)所提供的動(dòng)畫效果十分豐富,我們可以在自己的程序中選擇各種不同的動(dòng)畫效果,增強(qiáng)程序的趣味性。為使讀者對(duì)AnimateWindow函數(shù)有一個(gè)基本了解,我們先對(duì)該函數(shù)做一個(gè)簡(jiǎn)單介紹:
函數(shù)原型:BOOL AnimateWindow(HWND hWnd,DWORD dwTime,DWORD dwFlags)。
函數(shù)功能:該函數(shù)能在顯示與隱藏窗口時(shí)產(chǎn)生兩種特殊類型的動(dòng)畫效果:滾動(dòng)動(dòng)畫和滑動(dòng)動(dòng)畫。
參數(shù)含義:
hWnd:指定產(chǎn)生動(dòng)畫的窗口的句柄。
dwTime:指明動(dòng)畫持續(xù)的時(shí)間(以微秒計(jì)),完成一個(gè)動(dòng)畫的標(biāo)準(zhǔn)時(shí)間為200微秒。
dwFags:指定動(dòng)畫類型。這個(gè)參數(shù)可以是一個(gè)或多個(gè)下列標(biāo)志的組合。標(biāo)志描述:
AW_SLIDE:使用滑動(dòng)類型。缺省則為滾動(dòng)動(dòng)畫類型。當(dāng)使用AW_CENTER標(biāo)志時(shí),這個(gè)標(biāo)志就被忽略。
AW_ACTIVATE:激活窗口。在使用了AW_HIDE標(biāo)志后不能使用這個(gè)標(biāo)志。
AW_BLEND:實(shí)現(xiàn)淡出效果。只有當(dāng)hWnd為頂層窗口的時(shí)候才可以使用此標(biāo)志。
AW_HIDE:隱藏窗口,缺省則顯示窗口。
AW_CENTER:若使用了AW_HIDE標(biāo)志,則使窗口向內(nèi)重疊,即收縮窗口;若未使用AW_HIDE標(biāo)志,則使窗口向外擴(kuò)展,即展開窗口。
AW_HOR_POSITIVE:自左向右顯示窗口。該標(biāo)志可以在滾動(dòng)動(dòng)畫和滑動(dòng)動(dòng)畫中使用。當(dāng)使用AW_CENTER標(biāo)志時(shí),該標(biāo)志將被忽略。
AW_VER_POSITIVE:自頂向下顯示窗口。該標(biāo)志可以在滾動(dòng)動(dòng)畫和滑動(dòng)動(dòng)畫中使用。當(dāng)使用AW_CENTER標(biāo)志時(shí),該標(biāo)志將被忽略。
AW_VER_NEGATIVE:自下向上顯示窗口。該標(biāo)志可以在滾動(dòng)動(dòng)畫和滑動(dòng)動(dòng)畫中使用。當(dāng)使用AW_CENTER標(biāo)志時(shí),該標(biāo)志將被忽略。
返回值:如果函數(shù)成功,返回值為非零;如果函數(shù)失敗,返回值為零。在下列情況下函數(shù)將失?。?/span>
窗口使用了窗口邊界;窗口已經(jīng)可見仍要顯示窗口;窗口已經(jīng)隱藏仍要隱藏窗口。
三、動(dòng)畫窗口的實(shí)現(xiàn)
下面就以一個(gè)簡(jiǎn)單的單文檔程序?yàn)槔f明如何在VC中使用AnimateWindow函數(shù)來實(shí)現(xiàn)打開和關(guān)閉程序時(shí)的動(dòng)畫效果?;诙辔臋n與對(duì)話框的程序所用方法類似,本文就不一一介紹。筆者所使用的開發(fā)環(huán)境為:WindowsME,Visual C++6。
1、建立一個(gè)MFC AppWizard(exe)應(yīng)用工程Animate。
在MFC AppWizard向?qū)У牡谝徊街羞x擇Single document,再點(diǎn)擊按鍵Finish->OK完成工程建立。
2、在CMainFrame::OnCreate函數(shù)中增加黑體加粗部分語句。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ ……
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
AnimateWindow(GetSafeHwnd(),1000,AW_CENTER);
return 0;
}
3、使用MFC ClassWizard增加消息處理函數(shù)
使用ClassWizard在CMainFrame類中增加WM_CLOSE消息處理函數(shù),并增加以下語句。
void CMainFrame::OnClose()
{// TODO: Add your message handler code here and/or call default
AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_CENTER);
CFrameWnd::OnClose();
}
四、編譯時(shí)出現(xiàn)的問題
在實(shí)現(xiàn)動(dòng)畫窗口的程序時(shí),筆者發(fā)現(xiàn)如果直接在VC中使用AnimateWindow函數(shù),在編譯時(shí)會(huì)報(bào)告出錯(cuò)。以上述程序?yàn)槔?,在編譯時(shí)系統(tǒng)會(huì)報(bào)告:
'AnimateWindow' : undeclared identifier
'AW_HIDE' : undeclared identifier
'AW_CENTER' : undeclared identifier
通過錯(cuò)誤提示可以看出是編譯系統(tǒng)認(rèn)為AnimateWindow函數(shù)和AW_HIDE、AW_CENTER兩個(gè)參數(shù)沒有定義。因該函數(shù)是定義在Winuser.h頭文件中的,于時(shí),筆者顯示地在程序中定義了對(duì)該頭文件的包含,編譯時(shí)卻仍然出現(xiàn)相同的錯(cuò)誤。為什么在VC中編譯不能通過呢?通過查閱MSDN筆者發(fā)現(xiàn)在MSDN中明確提到WindowsNT5.0和Windows98以上版本均支持該函數(shù)。通過筆者的研究發(fā)現(xiàn),問題出在定義AnimateWindow函數(shù)的頭文件Winuser.h中,在VC安裝目錄下進(jìn)入include子目錄,用EDIT打開Winuser.h文件,按F3鍵查找AnimateWindow,可以發(fā)現(xiàn)有兩處定義,一處是定義該函數(shù)中使用到的參數(shù);另一處是該函數(shù)原型的定義。在這兩處定義中均出現(xiàn)了對(duì)Windows版本的條件判斷,#if (WINVER >= 0X500)……,原來問題出在這里,我們目前所使用的各種Windows主版本號(hào)均為5點(diǎn)零以下,所以在VC中編譯上述程序時(shí),編譯系統(tǒng)自然將AnimateWindow函數(shù)排除在外。因此為了在我們的程序中使用該函數(shù),就得對(duì)其頭文件進(jìn)行一些小小的修改,即將#if (WINVER >= 0X500)改為#if (WINVER >= 0X400),請(qǐng)注意兩處出現(xiàn)該函數(shù)定義的部分都要進(jìn)行修改。
修改好頭文件后,編譯即可通過。
五、小結(jié)
實(shí)際上在AnimateWindow函數(shù)中包含了多種動(dòng)畫效果,我們只須在程序中增加幾條語句,就能使得程序的開啟和關(guān)閉就得生動(dòng)有趣。
聯(lián)系客服