我正在尝试调用AnimateWindow
为 WinForms 窗口的显示和隐藏设置动画。
这是win32翻译的副本:
private static class NativeMethods
{
public const int AW_ACTIVATE = 0x20000;
public const int AW_HIDE = 0x10000;
public const int AW_BLEND = 0x80000;
public const int AW_CENTER = 0x00000010;
public const int AW_SLIDE = 0X40000;
public const int AW_HOR_POSITIVE = 0x1;
public const int AW_HOR_NEGATIVE = 0X2;
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern int AnimateWindow(IntPtr hwand, int dwTime, int dwFlags);
}
但问题是如何将调用AnimateWindow
放入 WinForms 方案中。一个人建议 OnLoad:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
AnimateWindow(this.Handle, 200, AW_ACTIVATE | AW_HOR_NEGATIVE | AW_SLIDE);
}
和OnClosing:
protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
base.OnClosing(e);
if (e.Cancel == false)
{
AnimateWindow(this.Handle, 200, AW_HIDE | AW_HOR_POSITIVE | AW_SLIDE);
}
}
除了它不起作用。
- 表单出现时不使用任何动画
- 在隐藏期间,表单将其水平滑出屏幕设置动画,然后重新出现,然后以正常方式隐藏
与 WinForms混合的正确方法是什么?AnimateWindow
也可以看看
- .NET AnimateWindow:这个人问了同样的问题。但由于它试图实现其他目标,人们解决了他的问题,而不是回答他的问题。
- C# WinForms AnimateWindow 问题:这个人对使用
AnimateWindow
子控件而不是顶级窗口感兴趣。
奖金喋喋不休
当我发现这个错误时,我正在仔细阅读Form -> Show -> Visible -> SetVisibleCore
:
protected virtual void SetVisibleCore(bool value)
{
try
{
HandleCollector.SuspendCollect();
//...snip...
}
finally
{
HandleCollector.ResumeCollect();
}
}
很高兴知道每个人都可以引入这些细微的错误。