Using AnimateWindow() at Form_Load

本文关键字:Form Load at AnimateWindow Using | 更新日期: 2023-09-27 18:04:08

我有一个无边界的表单,我使用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()方法使窗体淡出工作,但使用它使窗体淡出不做任何事情(不管time参数)。

任何想法?

Using AnimateWindow() at Form_Load

要正确地做到这一点是相当困难的,因为涉及到大量的代码,这是非常棘手的。在Winforms中,由Application类为启动表单设置的Visible属性和创建自己的表单时使用的Show()方法非常重要。原生窗口的创建在典型的。net风格中是懒惰的,当它开始运行时,会发生很多很多事情。

AnimateWindow()调用必须在Show()方法被调用和Winforms有机会调用ShowWindow()之间注入。当你在OnLoad()中尝试时,正是后者的调用破坏了动画效果,事件触发得太晚了。

您可以尝试以下代码,将其粘贴到您的Form类中:

    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子窗体上尝试,这样做不太可能有好结果。