c# - 在 Form_Load 中使用 AnimateWindow()

标签 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 参数如何)。

有什么想法吗?

最佳答案

这很难正确完成,涉及大量代码,很难推理。 Visible 属性由 Application 类为启动窗体和创建自己的 Show() 方法设置,这在 Winforms 中是非常重要的。 native 窗口创建在典型的 .NET 方式中是惰性的,当球滚动时会发生很多很多的事情。

必须在调用 Show() 方法和 Winforms 有机会调用 ShowWindow() 之间注入(inject) 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 子窗体上尝试它,不太可能有好的结果。

关于c# - 在 Form_Load 中使用 AnimateWindow(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31567474/

相关文章:

c# - 显示每个请求的所有 linq sql 查询

c# - 从 WinForms C# 应用程序从 SQL Server 2005/2008 上传/下载文件?

C# 计时器不会滴答作响

c# - 将 docx 文件转换为 WPF 流文档

c# - 如何在 asp.net mvc 中选择一个选择列表项?

c# - Sqlconnection 仍然需要 ssl 但 "encrypt=false"

.net - Windows.Forms.ListBox 中的项目右对齐

windows - 移动无边框样式的表单

c - 从 Iup_FlatButton 中完全删除边框

linux - Linux 上的无边框窗口