3

AnimateWindowWinForms ウィンドウの表示と非表示をアニメーション化するために呼び出そうとしています。

これは 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);
}

しかし問題は、呼び出しをAnimateWindowWinForms スキームにどのように適合させるかです。ある人は 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);
    }
}

それが機能しないことを除いて。

  • フォームは表示中にアニメーションを使用しません
  • 非表示中、フォームは画面から水平方向のスライドをアニメーション表示し、通常の方法で非表示にする前に再び表示されます

WinFormsと混合する正しい方法は何ですか?AnimateWindow


こちらもご覧ください

  • .NET AnimateWindow : この男は同じ質問をしました。しかし、それは別のことを達成しようとしていたので、人々は彼の質問に答えるよりも、彼の問題を解決した.
  • C# WinForms AnimateWindow の問題: この人物はAnimateWindow、トップレベル ウィンドウではなく、子コントロールを使用することに関心がありました。

ボーナスおしゃべり

このバグを発見したとき、私はを熟読していました:Form -> Show -> Visible -> SetVisibleCore

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

誰もがこれらの微妙なエラーを持ち込む可能性があることを知ってうれしい.

4

2 に答える 2

3

適切に機能するには限界があると思い ます。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();
  }
}
于 2011-12-12T16:15:53.830 に答える
0

あなたのAnimateWindow呼び出しが何をするのかはわかりませんが、基になるネイティブの「もの」を 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
于 2011-12-12T15:09:29.133 に答える