2009-02-18 16 views
15

Je sais comment placer une icône dans la zone de notification Windows (barre d'état système).Tray Icône animation

Quelle est la meilleure méthode pour animer une icône? Pouvez-vous utiliser un gif animé, ou devez-vous compter sur une minuterie? J'utilise C# et WPF, mais WinForms également accepté.

Répondre

22

Abhinaba Basu's blog post Animation and Text in System tray using C# explique.

Il se résume à:

  • faire un tableau d'icônes qui représentent chacun un cadre d'animation.
  • de créer une bande bitmap. Chaque trame est 16x16 pixels
  • d'utilisation SysTray.cs

par exemple,

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 utilise le code suivant pour créer le cadre d'animation

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()); 
    } 
} 

Pour animer le cadre StartAnimation démarre une minuterie et la minuterie les icônes sont modifiées pour animer toute la séquence .

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++; 
    } 
    .... 
} 

En utilisant SysTray

Créer et câbler votre menu

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

Obtenez une icône que vous souhaitez afficher statiquement dans le bac.

Créer un objet avec SysTray toutes les informations nécessaires

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

Créer des bandes d'images avec les images d'animation. Pour 6 bande de cadre l'image aura une largeur de 6 * 16 et hauteur 16 pixels

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

animation de début indiquant combien de fois vous avez besoin pour boucler l'animation et le retard de trame

m_sysTray.StartAnimation(150, 5); 

Pour arrêter l'appel d'animation

m_sysTray.StopAnimation(); 
+4

Assurez-vous de vérifier les commentaires sur cet article: «honte à moi :(Il y a beaucoup de fuites dans le code » (http://blogs.msdn.com/b/abhinaba/archive/2005/09/12/animation-and-text-in-system-tray-using-c. aspx # 504147) –

2

Je pense que la meilleure façon de faire cela est d'avoir plusieurs petites icônes que vous pouvez continuer à changer l'objet systray à la nouvelle image en fonction de la vitesse et l'heure.