2009-02-18 106 views
15

我知道如何在Windows通知區域(系統托盤)中放置圖標。托盤圖標動畫

讓圖標變成動畫的最佳方法是什麼?你可以使用動畫GIF,還是你必須依靠計時器?

我正在使用C#和WPF,但也接受了WinForms。

回答

22

Abhinaba Basu's blog post Animation and Text in System tray using C#解釋。

它歸結爲:

  • 使得圖標的每一個代表一個動畫幀的陣列。
  • 在定時器事件中切換托盤中的圖標
  • 創建位圖條。每幀是16×16像素
  • 使用SysTray.cs

例如

enter image description here

private void button1_Click(object sender, System.EventArgs e) 
{ 
    m_sysTray.StopAnimation(); 
    Bitmap bmp = new Bitmap("tick.bmp"); 
    // the color from the left bottom pixel will be made transparent 
    bmp.MakeTransparent(); 
    m_sysTray.SetAnimationClip(bmp); 
    m_sysTray.StartAnimation(150, 5); 
} 

SetAnimationClip使用以下代碼來創建的動畫幀

public void SetAnimationClip (Bitmap bitmapStrip) 
{ 
    m_animationIcons = new Icon[bitmapStrip.Width/16]; 
    for (int i = 0; i < m_animationIcons.Length; i++) 
    { 
     Rectangle rect = new Rectangle(i*16, 0, 16, 16); 
     Bitmap bmp = bitmapStrip.Clone(rect, bitmapStrip.PixelFormat); 
     m_animationIcons[i] = Icon.FromHandle(bmp.GetHicon()); 
    } 
} 

要動畫幀StartAnimation啓動定時器並且在該定時器的圖標改變爲動畫整個序列。

public void StartAnimation(int interval, int loopCount) 
{ 
    if(m_animationIcons == null) 
     throw new ApplicationException("Animation clip not set with  
             SetAnimationClip"); 

    m_loopCount = loopCount; 
    m_timer.Interval = interval; 
    m_timer.Start(); 
} 

private void m_timer_Tick(object sender, EventArgs e) 
{ 
    if(m_currIndex < m_animationIcons.Length) 
    { 
     m_notifyIcon.Icon = m_animationIcons[m_currIndex]; 
     m_currIndex++; 
    } 
    .... 
} 

使用系統托盤

創建和電線您的菜單

ContextMenu m_menu = new ContextMenu();         
m_menu.MenuItems.Add(0, new MenuItem("Show",new 
        System.EventHandler(Show_Click))); 

獲取要在托盤靜態顯示的圖標。

具有所有所需要的信息

m_sysTray = new SysTray("Right click for context menu", 
      new Icon(GetType(),"TrayIcon.ico"), m_menu); 

創建具有動畫幀圖像條創建系統托盤對象。爲6幀條上的圖像將具有6×16的寬度和高度作爲16個像素

Bitmap bmp = new Bitmap("tick.bmp"); 
// the color from the left bottom pixel will be made transparent 
bmp.MakeTransparent(); 
m_sysTray.SetAnimationClip(bmp); 

開始動畫,指示有多少次需要循環動畫和幀延遲

m_sysTray.StartAnimation(150, 5); 

要停止動畫調用

m_sysTray.StopAnimation(); 
+4

請一定要檢查該文章的評論:「可恥的是我:(裏有很多代碼泄漏」(http://blogs.msdn.com/b/abhinaba/archive/2005/09/12 /動畫和文本在系統托盤-使用-C。 ASPX#504147) – 2012-01-05 00:30:56

2

我認爲最好的辦法是擁有多個小圖標,您可以根據速度和時間繼續將系統托盤對象更改爲新圖片。