一、MSN拉簾式窗口制作
分三部分:1、窗口的顯示;2、窗口的停留;3、窗口的消失;
如果達(dá)到這樣郊果,系統(tǒng)中要有三個(gè)定時(shí)器,進(jìn)行分別控制。定義的定時(shí)器如下:
#define ID_TIMER_POP_WINDOW 1 #define ID_TIMER_DISPALY_DELAY 2 #define ID_TIMER_CLOSE_WINDOW 3 |
從CWnd 繼承一個(gè)窗口,當(dāng)然也可以從CFrameWnd進(jìn)行派生,這不是主要問題,關(guān)鍵是看你是怎么處理WM_PAINT,WM_MOUSEMOVE,WM_TIMER的消息。一般情況,我從OnPaint()中進(jìn)行顯示圖片,在WM_TIMER中處理定時(shí)器消息,下面是處里定時(shí)器時(shí)用到的代碼:
CMsgWnd::CMsgWnd() { ... SetTimer(ID_TIEMR_POP_WINDOW,20,NULL); ... } void CMsgWnd::OnTimer(UINT nIDEvent) { static int nHeight=0; int cy=GetSystemMetrics(SM_CYSCREEN); int cx=GetSystemMetrics(SM_CXSCREEN); RECT rect; SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0); int y=rect.bottom-rect.top; int x=rect.right-rect.left; x=x-WIN_WIDTH; switch(nIDEvent) { case ID_TIMER_POP_WINDOW: if(nHeight<=WIN_HEIGHT) { ++nHeight; MoveWindow(x,y-nHeight,WIN_WIDTH,WIN_HEIGHT); Invalidate(FALSE); } else { KillTimer(ID_TIMER_POP_WINDOW); SetTimer(ID_TIMER_DISPLAY_DELAY,5000,NULL); } break; case ID_TIMER_CLOSE_WINDOW: if(nHeight>=0) { nHeight--; MoveWindow(x,y-nHeight,WIN_WIDTH,nHeight); } else { KillTimer(ID_TIMER_CLOSE_WINDOW); SendMessage(WM_CLOSE); } break; case ID_TIMER_DISPLAY_DELAY: KillTimer(ID_TIMER_DISPLAY_DELAY); SetTimer(ID_TIMER_CLOSE_WINDOW,20,NULL); break; } CWnd::OnTimer(nIDEvent); } |
根據(jù)你設(shè)的定時(shí)器的長短來控制窗口的顯示過程;
二、QQ淡出淡出顯示實(shí)現(xiàn)
其實(shí)用到一個(gè)API函數(shù):AnimateWindow,下面是這個(gè)函數(shù)的一些說明:
BOOL AnimateWindow(
HWND hwnd, // handle to the window to animate
DWORD dwTime, // duration of animation
DWORD dwFlags // animation type
);
上面的函數(shù)前兩個(gè)參數(shù)一看就明白,不用說了,最后一個(gè)參數(shù)dwFlags設(shè)置動畫窗口的樣式:
各種標(biāo)志說明:
標(biāo)志
說明
AW_SLIDE
Uses slide animation. By default, roll animation is used.
This flag is ignored when used with the AW_CENTER flag.
AW_ACTIVATE
Activates the window. Do not use this flag with AW_HIDE.
AW_BLEND
Uses a fade effect. This flag can be used only if hwnd is a top-level window.
AW_HIDE
Hides the window. By default, the window is shown.
AW_CENTER
Makes the window appear to collapse inward if the AW_HIDE flag is used or expand outward
if the AW_HIDE flag is not used.
AW_HOR_POSITIVE
Animate the window from left to right. This flag can be used with roll or slide animation. It is ignored when used with the AW_CENTER flag.
AW_HOR_NEGATIVE
Animate the window from right to left. This flag can be used with roll or slide animation.
It is ignored when used with the AW_CENTER flag.
AW_VER_POSITIVE
Animate the window from top to bottom. This flag can be used with roll or slide animation.
It is ignored when used with the AW_CENTER flag.
AW_VER_NEGATIVE
Animate the window from bottom to top. This flag can be used with roll or slide animation.
It is ignored when used with the AW_CENTER flag.
以上內(nèi)容是從MSDN中摘錄的,要淡入淡出的效果的話,用到AW_BELND。
三、控制窗口顯示的代碼
CMainFrame::OnCreate(…)
{
//...
AnimateWindow(GetSafeHwnd(),1000,AW_CENTER|AW_BLEND);
//…
}
四、關(guān)閉的代碼
CMainFrame::OnClose(..)
{
AnimateWindow(GetSafeHwnd(),1000,AW_HIDE|AW_CENTER|AW_BLEND);
}
其實(shí)AnimateWindow只是利用了windows本身的方法,如果您要更加有個(gè)性的窗口效果,那就得多做寫些代碼了,一分辛苦,一分收獲吧
五、結(jié)束語
其實(shí)就MSN的提示窗口來說,如果要從使用復(fù)雜一點(diǎn)的背景和效果,那么還有刷新屏幕的問題,應(yīng)做到無閃刷新.由于時(shí)間蒼促,不足之處必然有之,同時(shí)以上代碼也參考了一部分以前 VCKBASE 技術(shù)文檔,在此表示感謝!
如果有問題,歡迎交流!共同進(jìn)步!