当您收到新电子邮件时,我正在尝试创建一个类似于Outlook使用的通知窗口。我在通知窗口上有一个无模式的窗体,上面有两个Label控件以显示通知信息。为了获得淡入效果,我要调用Win32 AnimateWindow函数。除了一件事,一切似乎都正常。

当我p /调用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。是的,它可以工作,但这是一个hack ...有更好的主意吗?

最佳答案

codeproject站点上有一个很好的例子。

关于c# - .NET AnimateWindow,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1493293/

10-11 23:28