int CSplashWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CWnd::OnCreate(lpCreateStruct) == -1)
return -1;
CenterWindow(); // 啟動畫面窗口居中
SetTimer(1, 3000, NULL); // 啟動畫面顯示時間為 3 秒
AnimateWindow(1200, AW_BLEND); // 窗口漸顯,實現淡入效果,時間 1.2 秒
return 0;
}
void CSplashWnd::OnClose()
{
AnimateWindow(800, AW_BLEND | AW_HIDE); // 窗口漸隱,實現淡出效果,時間 0.8 秒
CWnd::OnClose();
}
void CSplashWnd::OnTimer(UINT_PTR nIDEvent)
{
KillTimer(1); // 銷毀定時器
PostMessage(WM_CLOSE); // 關閉啟動畫面
CWnd::OnTimer(nIDEvent);
}
BOOL CSplashWnd::OnEraseBkgnd(CDC* pDC)
{
HINSTANCE hApp = ::GetModuleHandle(NULL); // 得到應用程序的模塊句柄
HBITMAP hbmp = ::LoadBitmap(hApp, MAKEINTRESOURCE(IDB_BITMAP13)); //加載程序中的位圖資源
HDC hmdc = ::CreateCompatibleDC(pDC->GetSafeHdc()); // 創建兼容 DC作為內存 DC
HBITMAP hbmpOld = (HBITMAP) ::SelectObject(hmdc, hbmp); //將位圖選入內存 DC
::BitBlt(pDC->GetSafeHdc(), 0, 0, SPLASH_WIDTH, SPLASH_HEIGHT, hmdc, 0, 0, SRCCOPY); // 將內存 DC 中的內容拷貝到設備 DC 以顯示
// 清理,防止內存洩漏
::SelectObject(hmdc, hbmpOld);
::DeleteObject(hbmp);
::DeleteDC(hmdc);
return CWnd::OnEraseBkgnd(pDC);
}
實現啟動畫面淡入淡出時遇到一個疑惑。相關代碼如上。按道理應該SetTimer後會響應OnTimer();但是我調試發現竟然沒有。。
CSplashWnd對象的創建我是在CMainFrame的OnCreate中進行的;
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
CSplashWnd* temp = new CSplashWnd(); //顯示啟動畫面
temp->OnCreate(lpCreateStruct);
Sleep(1000);
temp->OnClose();
temp->~CSplashWnd();
temp = NULL; //釋放內存
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
..........
temp->OnCreate(lpCreateStruct);後根本就沒進入OnTimer()...
是不是我哪個地方概念沒搞清楚= =
不用那麼麻煩,最簡單的做法是定時器循環調用
SetLayeredWindowAttributes
http://baike.baidu.com/link?url=D8_84M_5ZKBL4ebuRvw8eg8czVE3IEA1LWp231UhM0O6tTpIueblszz6ddZC9oCbIYT1QpubqwsbjXDO7ZnoHK
bAlpha參數決定了透明度,從0~255走一遍就是淡入了,反之就是淡出了。