最开始想到的是把创建的窗口隐藏起来,然后调用AnimateWindow。但是因为基础知识不够,找不到适合调用的地方。
如果窗口还没创建完成,调用AnimateWindow就会失败,但是什么时候窗口创建成功呢?
窗口创建完成后的第一次调用最终使用用了SetWindowPos来实现了功能。
1、首先创建的窗口隐藏
2、设置定时器
3、调用SetWindowPos将整个窗口一部分一部分的显示出来。
LRESULT CMyWindow::OnTimer(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
//获取屏幕宽高
INT ixScreen = GetSystemMetrics(SM_CXSCREEN);
INT iyScreen = GetSystemMetrics(SM_CYSCREEN);
static UINT uCount = 0;
if (1 == (int)wParam)
{
if (uCount < 5)
{
uCount++;
if (uCount < 5)
{
//winWidth表示要显示的窗口宽度
INT winWidth = (ixScreen/5) * uCount;
SetWindowPos(m_hWnd, NULL, ixScreen-winWidth, 0, winWidth, iyScreen, SWP_SHOWWINDOW);
}
else
{
SetWindowPos(m_hWnd, NULL, 0, 0, ixScreen, iyScreen, SWP_SHOWWINDOW);
KillTimer(m_hWnd, 1);
}
}
}
return 0;
}
当然在其它地方,也就是窗口显示出来了,这个时候用户隐藏和显示窗口同样可以使用AnimateWindow
BOOL AnimateWindow(HWND hWnd, DWORD dwTime, DWORD dwFlags);
dwFlags: AW_HIDE(隐藏窗口) AW_ACTIVE(显示窗口)
//动画退出的效果
void CMyWindow::HideWindow(HWND hWnd)
{
::AnimateWindow(hWnd, 200, AW_HIDE | AW_HOR_POSITIVE | AW_SLIDE);
}
//动画进入的效果
void CMyWindow::ShowWindow(HWND hWnd)
{
::AnimateWindow(hWnd, 200, AW_ACTIVATE | AW_HOR_NEGATIVE | AW_SLIDE);
}