Правильный способ вызова 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();
  }
}

Я не уверен, что ты AnimateWindowcall делает, но когда вам нужно изменить базовые "вещи" для форм 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
Другие вопросы по тегам