WIN32,C ++:是否可以在不隐藏窗口的情况下为窗口设置动画?

时间:2009-08-15 17:50:39

标签: c++ winapi animation

我有一个我想要动画的编辑控件(文本字段)。我想要的动画是它滑出来,为这个文本字段创建一个额外的行。我可以为我的文本字段设置动画并使其更大,但是为了显示我首先要隐藏它的滑动动画。这意味着整个文本字段滑出,好像是第一次从零开始创建,而不是仅添加新行。

这是我现在的代码:

SetWindowPos(hwnd, HWND_TOP, x, y, newWidth, newHeight, SWP_DRAWFRAME);

ShowWindow(hwnd, SW_HIDE);

AnimateWindow(hwnd, 300, AW_SLIDE | AW_VER_NEGATIVE);

是否可以在不隐藏动画的情况下显示此动画?

3 个答案:

答案 0 :(得分:6)

为了扩展Nick D的答案,以下是实现您所需要的代码......

·H

#define ANIMATION_TIMER 1234
#define ANIMATION_LIMIT 8
#define ANIMATION_OFFSET 4

int m_nAnimationCount;

的.cpp

void CExampleDlg::OnTimer(UINT_PTR nIDEvent)
{
    if (nIDEvent == ANIMATION_TIMER)
    {
        if (++m_nAnimationCount > ANIMATION_LIMIT)
            KillTimer(EXPAND_TIMER);
        else
        {
            CRect rcExpand;
            m_edtExpand.GetWindowRect(rcExpand);
            ScreenToClient(rcExpand);

            rcExpand.bottom += ANIMATION_OFFSET;

            m_edtExpand.MoveWindow(rcExpand);
        }   
    }

    CDialog::OnTimer(nIDEvent);
}

void CExampleDlg::OnStartAnimation()
{
    m_nAnimationCount = 0;
    SetTimer(ANIMATION_TIMER, 20, NULL);
}

不要忘记在编辑控件(m_edtExpand)上设置 Multiline 属性

答案 1 :(得分:3)

另一种方法是使用SetTimer function模拟动画,该动画会调用例程来逐步调整窗口大小。

答案 2 :(得分:0)

我认为使用内置的AnimateWindow API是不可能的。 AnimateWindow http://msdn.microsoft.com/en-us/library/ms632669(VS.85).aspx的MSDN条目表示它用于“在显示或隐藏窗口时产生特殊效果”,AW_HIDE标志确定该函数显示或隐藏窗口。而且我看不到任何其他内置功能来做你想做的事。

因此,Nick D.和Alan有正确的方法来自己调整大小。这通常是解决方案。 (我之前从未听说过AnimateWindow。)我假设AnimateWindow在内部做了类似的事情,不过我认为它更可靠。

如果在文本框中添加或删除了另一行,或者在完成动画制作之前调整其大小,显然还需要确保Timer做正确的事。

如果编码不方便,还要认真考虑将动画设为低优先级。