今日免费次数已满, 请开通会员/明日再来

7

我有一个编辑控件(文本框),想要对其进行动画处理。我想要的动画效果是它滑出,为该文本框创建一行额外的空间。我能够对文本框进行动画处理,并使其变大,但是为了显示滑动动画,我必须先将其隐藏。这意味着整个文本框都会像从无到有一样滑出,而不仅仅是添加一行新内容。

这是我现在的代码:

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

ShowWindow(hwnd, SW_HIDE);

AnimateWindow(hwnd, 300, AW_SLIDE | AW_VER_NEGATIVE);

有没有可能在不隐藏动画的情况下展示它?
3个回答

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)上设置多行属性。


3

另一种方法是使用SetTimer函数模拟动画,该函数将调用一个例程以逐步调整窗口大小。


0

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

因此,Nick D.和Alan的编码方式是正确的,自己编写调整大小的代码通常是解决方案。(我以前从未听说过AnimateWindow。)我假设AnimateWindow在内部执行了非常类似的操作,尽管我认为它更可靠。

显然,您还需要确保计时器在文本框添加或删除另一行,或者在动画完成之前调整大小时执行正确的操作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接