使用.NET WinForms窗体调用AnimateWindow的正确方法?
我正在尝试调用以设置WinForms窗口的显示和隐藏动画 这是一份: 但问题是如何将对的调用放入WinForms方案中OnLoad:使用.NET WinForms窗体调用AnimateWindow的正确方法?,winforms,animatewindow,Winforms,Animatewindow,我正在尝试调用以设置WinForms窗口的显示和隐藏动画 这是一份: 但问题是如何将对的调用放入WinForms方案中OnLoad: protected override void OnLoad(EventArgs e) { base.OnLoad(e); AnimateWindow(this.Handle, 200, AW_ACTIVATE | AW_HOR_NEGATIVE | AW_SLIDE); } protected override void OnClosing(S
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);
}
}
而一旦丢失:
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
花言巧语 我正在浏览
表单->显示->可见->设置可见核心
,这时我发现了这个bug:
protected virtual void SetVisibleCore(bool value)
{
try
{
HandleCollector.SuspendCollect();
//...snip...
}
finally
{
HandleCollector.ResumeCollect();
}
}
很高兴知道每个人都会引入这些微妙的错误。我不确定您的调用会做什么,但当您需要更改底层本机“内容”以处理windows窗体时,我总是使用CreateParams()覆盖。你可以
为你想要实现的目标找到一个类似的函数
下面是一个透明工具窗口的示例,它在显示时不会激活
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
Dim baseParams As Windows.Forms.CreateParams = MyBase.CreateParams
baseParams.ExStyle = baseParams.ExStyle Or NativeMethods.ExtendedWindowsStyles.WS_EX_LAYERED Or NativeMethods.ExtendedWindowsStyles.WS_EX_TRANSPARENT Or NativeMethods.ExtendedWindowsStyles.WS_EX_NOACTIVATE Or NativeMethods.ExtendedWindowsStyles.WS_EX_TOOLWINDOW
Return baseParams
End Get
End Property
我认为AnimateWindow
在正常工作方面有其局限性。例如,它不能很好地与Aero配合使用,因此要为滑动窗体设置动画,需要将BorderStyle
设置为None。另外,确保StartPosition
设置为手动
简单的例子:
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();
}
}
爆炸;我不是在处理“吐司”窗口;但是一个完全成熟的最大化窗口。@IanBoyd Winforms不会喜欢这样。考虑到这个动画窗口有这么多问题,我很好奇微软默认使用什么API来最小化动画。