.NET AnimateWindow(.NET AnimateWindow)

2019-07-20 02:15发布

我试图做一个通知窗口,当你收到新的电子邮件如Outlook使用。 我有上面有两个Label控件的通知窗口显示通知信息模式窗体。 要获得淡入效果,我是P /调用Win32的AnimateWindow功能。 一切似乎除了一件事好吗工作。

当我的P / Invoke AnimateWindow,在Label控件的文本形式的调查后的动画效果是在刚刚出现。 我想它逐渐与表格的其余部分褪色英寸 我怀疑它是与当表单更新其子控件。 我想,该表格没有告诉其子更新,直到AnimateWindow调用之后。 我试图坚持Form.Update()设置为标签的文本字段后调用,但这并不能帮助。

基本步骤我现在服用:

// Main form of the application.
public class MainForm : Form
{
   // The notification toast.
   protected ToastForm toast;

   // Public method called to show and update the toast.
   public void UpdateToast( string text1, string text2 )
   {
      // Create a new toast form if one does not exist yet.
      if ( this.toast == null )
      {
         this.toast = new ToastForm();
      }

      // Update the toast form's Label controls.
      // Note that this isn't exactly how it's done in my app.  There are fields safely
      // wrapping the Label controls.  I just did it this way here to be concise.
      this.toast.firstLabel.Text = text1;
      this.toast.secondLabel.Text = text2;

      // This doesn't help.
      this.toast.Update();

      // P/invoke the Win32 AnimateWindow function on the toast form.
      User32.AnimateWindow( this.toast.Handle, 750, AnimateWindowFlags.AW_ACTIVATE | AnimateWindowFlags.AW_BLEND );

      // Call Show method on the toast form.  This is needed to get the controls to
      // update at all.
      this.toast.Show( this );
   }
}

没有人有任何建议,得到这个工作?

编辑:
我摸索出了黑客攻击。 标签文本分配后,我设置了敬酒的大小为0,宽度和高度为0。 接下来,我先打电话展,然后在吐司隐藏。 然后,我设置了烤面包的大小回到它最初。 最后,我呼吁AnimateWindow上致祝酒辞。 是啊,它的工作原理,但它是一个黑客...任何更好的想法?

Answer 1:

有这样的一个很好的例子在CodeProject网站。



Answer 2:

默认情况下,WinForms控件使用GDI +呈现文本。 我怀疑这是对这种行为的原因。

尝试禁用兼容文本呈现在整个应用程序或为标签 ,迫使它使用GDI来代替。



Answer 3:

只需使用一个计时器,通过其在褪色的形式Opacity属性。 应该为你工作的伟大。



文章来源: .NET AnimateWindow