2009-09-29 39 views
2

我試圖使Outlook收到新電子郵件時使用通知窗口。我爲通知窗口提供了一個無模式窗體,其中包含兩個Label控件以顯示通知信息。爲了獲得淡入效果,我正在調用Win32 AnimateWindow函數。除了一件事外,一切似乎都行得通。.NET AnimateWindow

當我調用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高度。接下來,我先打電話給Show,然後再在麪包上隱藏。然後,我將烤麪包的大小恢復爲原來的大小。最後,我在烤麪包上叫AnimateWindow。是的,它的作品,但它是一個黑客...任何更好的想法?

+0

閱讀[本博客文章](http://weblogs.asp.net/justin_rogers/archive/2004/07/28/200213.aspx)。 – SLaks 2009-09-29 19:17:28

回答

2

codeproject網站上有一個很好的例子。

+0

這是一個很好的例子,但我正在尋找.NET中的東西。 – madhatter160 2009-09-29 16:46:12

+0

對不起,這是我應該包括的例子,它好多了。 http://www.codeproject.com/KB/miscctrl/taskbarnotifier.aspx – 2009-09-29 20:05:40

+0

很好的例子。但是,它使用自定義動畫代碼而不是AnimateWindow,並且不使用Label控件。從我發佈自己的問題後看到的內容看來,AnimateWindow和WinForms並沒有很好地發揮作用。這個自定義解決方案很好地滿足了我的需求。 – madhatter160 2009-09-30 12:24:22

0

默認情況下,WinForms控件使用GDI +來呈現文本。我懷疑這是造成這種行爲的原因。

嘗試禁用兼容文本渲染in the entire applicationfor the labels強制其使用GDI代替。

+0

任何一種方法都沒有運氣。 – madhatter160 2009-09-29 16:51:39

0

只需使用計時器並通過其Opacity屬性褪色表單。應該對你很好。