[英]WIN32, C++: Is it possible to animate a window without hiding it?
我有一个编辑控件(文本字段),我想要动画。 我想要的动画是它滑出来,为这个文本字段创建一个额外的行。 我可以为我的文本字段设置动画并使其更大,但是为了显示我首先要隐藏它的滑动动画。 这意味着整个文本字段滑出,好像是第一次从零开始创建,而不是仅添加新行。
这是我现在的代码:
SetWindowPos(hwnd, HWND_TOP, x, y, newWidth, newHeight, SWP_DRAWFRAME);
ShowWindow(hwnd, SW_HIDE);
AnimateWindow(hwnd, 300, AW_SLIDE | AW_VER_NEGATIVE);
是否可以在不隐藏它的情况下显示此动画?
为了扩展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);
}
不要忘记在编辑控件上设置Multiline属性(m_edtExpand)
另一种方法是使用SetTimer函数模拟动画,该函数将调用例程以递增方式调整窗口大小。
我认为使用内置的AnimateWindow API是不可能的。 AnimateWindow的MSDN条目http://msdn.microsoft.com/en-us/library/ms632669(VS.85).aspx表示它用于“在显示或隐藏窗口时产生特殊效果”,AW_HIDE标志确定该功能显示或隐藏窗口。 而且我看不到任何替代的内置函数来做你想要的。
因此,Nick D.和Alan有正确的方法来自己调整大小。 这通常是解决方案。 (我之前从未听说过AnimateWindow。)我假设AnimateWindow在内部做了类似的事情,尽管我认为它更可靠。
显然,在完成动画制作之前,如果在文本框中添加或删除了另一行,或者其他行已调整大小,则显然需要确保Timer做正确的事情。
如果编码不方便,还要认真考虑将动画设置为低优先级。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.