Правильный способ вызова AnimateWindow с формой.NET WinForms?
Я пытаюсь позвонить AnimateWindow
оживить шоу и скрыть окно WinForms.
Вот копия перевода win32:
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. Один человек предлагает 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(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 проблема: этот парень был заинтересован в использовании
AnimateWindow
с дочерними элементами управления, а не с окном верхнего уровня.
Бонус Болтовня
я просматривал Form -> Show -> Visible -> SetVisibleCore
, когда я обнаружил эту ошибку:
protected virtual void SetVisibleCore(bool value)
{
try
{
HandleCollector.SuspendCollect();
//...snip...
}
finally
{
HandleCollector.ResumeCollect();
}
}
Приятно осознавать, что каждый может внести эти тонкие ошибки.
2 ответа
Я думаю AnimateWindow
имеет свои ограничения для правильной работы. Например, он не очень хорошо работает с Aero, поэтому для анимации скользящей формы вам необходимо установить BorderStyle
Никому. Кроме того, убедитесь, что 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();
}
}
Я не уверен, что ты AnimateWindow
call делает, но когда вам нужно изменить базовые "вещи" для форм 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