Правильный способ вызвать AnimateWindow с формой .NET WinForms? - PullRequest
2 голосов
/ 12 декабря 2011

Я пытаюсь вызвать 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);
}

и OnClosing :

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 ]

2 голосов
/ 12 декабря 2011

I думаю, 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();
  }
}
0 голосов
/ 12 декабря 2011

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