gpt4 book ai didi

winforms - 使用 .NET WinForms 窗体调用 AnimateWindow 的正确方法?

转载 作者:行者123 更新时间:2023-12-04 14:41:10 27 4
gpt4 key购买 nike

我正在尝试调用 AnimateWindow动画显示和隐藏 WinForms 窗口。

这是 the win32 translation 的副本:

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 方案。 One person suggests 加载:

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
AnimateWindow(this.Handle, 200, AW_ACTIVATE | AW_HOR_NEGATIVE | AW_SLIDE);
}

关闭:

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);
}
}

除了它不起作用。

  • 表单出现时不使用任何动画
  • 在隐藏过程中,表单以动画方式将其水平滑出屏幕,然后在以正常方式隐藏之前重新出现

什么是正确的混合方式AnimateWindow使用 WinForms?


另见

  • .NET AnimateWindow : 这个人问了同样的问题。但由于它试图实现其他目标,人们解决了他的问题而不是回答他的问题。
  • C# WinForms AnimateWindow issue : 这家伙有兴趣将 AnimateWindow 与子控件一起使用,而不是顶级窗口。

奖金聊天

我是perusing通过 Form -> Show -> Visible -> SetVisibleCore,当我发现这个错误时:

protected virtual void SetVisibleCore(bool value)
{
try
{
HandleCollector.SuspendCollect();
//...snip...
}
finally
{
HandleCollector.ResumeCollect();
}
}

很高兴知道每个人都可以引入这些细微的错误。

最佳答案

认为 AnimateWindow 有其正常工作的局限性。例如,它不能很好地与 Aero 配合使用,因此要为滑动窗体设置动画,您需要将 BorderStyle 设置为 None。此外,确保 StartPosition 设置为 Manual。

简单的例子:

public partial class Form1 : Form {

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);

public Form1() {
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e) {
Form toastForm = new Form();
toastForm.ShowInTaskbar = false;
toastForm.StartPosition = FormStartPosition.Manual;
toastForm.FormBorderStyle = FormBorderStyle.None;
toastForm.Size = new Size(256, 64);
toastForm.Location = new Point(Screen.PrimaryScreen.WorkingArea.Right - toastForm.Width,
Screen.PrimaryScreen.WorkingArea.Bottom - toastForm.Height);

Button closeButton = new Button();
closeButton.Text = "Close";
toastForm.Controls.Add(closeButton);
closeButton.Click += delegate { toastForm.Close(); };

AnimateWindow(toastForm.Handle, 200, AW_ACTIVATE | AW_HOR_NEGATIVE | AW_SLIDE);
toastForm.Show();
}
}

关于winforms - 使用 .NET WinForms 窗体调用 AnimateWindow 的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8476182/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com