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()...
是不是我哪个地方概念没搞清楚= =