在 Form_Load 使用 AnimateWindow()
Using AnimateWindow() at Form_Load
我有一个无边框窗体,我使用 AnimateWindow() 方法为窗体的打开、关闭等创建动画。我使用此代码:
[Flags]
enum AnimateWindowFlags
{
AW_HOR_POSITIVE = 0x0000000
AW_HOR_NEGATIVE = 0x00000002,
AW_VER_POSITIVE = 0x00000004,
AW_VER_NEGATIVE = 0x00000008,
AW_CENTER = 0x00000010,
AW_HIDE = 0x00010000,
AW_ACTIVATE = 0x00020000,
AW_SLIDE = 0x00040000,
AW_BLEND = 0x00080000
}
[DllImport("user32.dll")]
static extern bool AnimateWindow(IntPtr hWnd, int time, AnimateWindowFlags flags);
在关闭表单时,这段代码似乎有效:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
AnimateWindow(this.Handle, 100, AnimateWindowFlags.AW_BLEND | AnimateWindowFlags.AW_HIDE);
}
但是,当使用此代码打开表单时:
private void Form1_Load(object sender, EventArgs e)
{
AnimateWindow(this.Handle, 100, AnimateWindowFlags.AW_BLEND);
}
似乎什么都没发生。在做了一些猜测和测试后,我发现使用 AnimateWindow() 方法使表单 淡出 有效,但使用它使表单 淡入 [=27] =] 不执行任何操作(无论 time
参数如何)。
有什么想法吗?
这很难正确完成,涉及大量代码,推理起来非常棘手。 Visible 属性,由 Application class 为启动窗体和创建自己的 Show() 方法设置,这在 Winforms 中非常重要。本机 window 创建在典型的 .NET 时尚中是懒惰的,当球开始滚动时会发生很多很多事情。
必须在调用 Show() 方法和 Winforms 有机会调用 ShowWindow() 之间注入 AnimateWindow() 调用。当你在 OnLoad() 中尝试它时,是后者的调用破坏了动画效果,事件触发得太晚了。
您可以试试这段代码,将其粘贴到您的表单中 class:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
NativeMethods.AnimateWindow(this.Handle, 100, AnimateWindowFlags.AW_BLEND);
}
base.SetVisibleCore(value);
}
protected override void OnShown(EventArgs e) {
this.BringToFront();
base.OnShown(e);
}
但我不能保证它在所有可能的情况下都能正常工作,而且我还没有对它进行广泛的测试。必须调用 BringToFront() 已经是一个令人不快的 hack。不要在 MDI 子窗体上尝试,不太可能有好结果。
我有一个无边框窗体,我使用 AnimateWindow() 方法为窗体的打开、关闭等创建动画。我使用此代码:
[Flags]
enum AnimateWindowFlags
{
AW_HOR_POSITIVE = 0x0000000
AW_HOR_NEGATIVE = 0x00000002,
AW_VER_POSITIVE = 0x00000004,
AW_VER_NEGATIVE = 0x00000008,
AW_CENTER = 0x00000010,
AW_HIDE = 0x00010000,
AW_ACTIVATE = 0x00020000,
AW_SLIDE = 0x00040000,
AW_BLEND = 0x00080000
}
[DllImport("user32.dll")]
static extern bool AnimateWindow(IntPtr hWnd, int time, AnimateWindowFlags flags);
在关闭表单时,这段代码似乎有效:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
AnimateWindow(this.Handle, 100, AnimateWindowFlags.AW_BLEND | AnimateWindowFlags.AW_HIDE);
}
但是,当使用此代码打开表单时:
private void Form1_Load(object sender, EventArgs e)
{
AnimateWindow(this.Handle, 100, AnimateWindowFlags.AW_BLEND);
}
似乎什么都没发生。在做了一些猜测和测试后,我发现使用 AnimateWindow() 方法使表单 淡出 有效,但使用它使表单 淡入 [=27] =] 不执行任何操作(无论 time
参数如何)。
有什么想法吗?
这很难正确完成,涉及大量代码,推理起来非常棘手。 Visible 属性,由 Application class 为启动窗体和创建自己的 Show() 方法设置,这在 Winforms 中非常重要。本机 window 创建在典型的 .NET 时尚中是懒惰的,当球开始滚动时会发生很多很多事情。
必须在调用 Show() 方法和 Winforms 有机会调用 ShowWindow() 之间注入 AnimateWindow() 调用。当你在 OnLoad() 中尝试它时,是后者的调用破坏了动画效果,事件触发得太晚了。
您可以试试这段代码,将其粘贴到您的表单中 class:
protected override void SetVisibleCore(bool value) {
if (!this.IsHandleCreated) {
NativeMethods.AnimateWindow(this.Handle, 100, AnimateWindowFlags.AW_BLEND);
}
base.SetVisibleCore(value);
}
protected override void OnShown(EventArgs e) {
this.BringToFront();
base.OnShown(e);
}
但我不能保证它在所有可能的情况下都能正常工作,而且我还没有对它进行广泛的测试。必须调用 BringToFront() 已经是一个令人不快的 hack。不要在 MDI 子窗体上尝试,不太可能有好结果。