在Form_Load

时间:2015-07-22 15:24:33

标签: c# winforms borderless animatewindow

我有一个无边框表单,我使用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参数如何)。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这很难正确完成,涉及到大量代码,非常难以理解。 Visible属性由创建表单的Application类和创建自己的Show()方法设置,在Winforms中是一个非常大的问题。原生窗口创建在典型的.NET时尚中是懒惰的,当球滚动时会发生很多很多东西。

必须在调用Show()方法和Winforms有机会调用ShowWindow()之间注入AnimateWindow()调用。当你在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()已经是一个不愉快的黑客。不要在MDI子表单上尝试,不太可能达到目的。