2009-02-18 23 views
15

Sé cómo colocar un icono en el área de notificaciones de Windows (bandeja del sistema).Animación del icono de bandeja

¿Cuál es el mejor método para animar un ícono? ¿Puedes usar un gif animado, o tienes que depender de un temporizador?

Estoy usando C# y WPF, pero WinForms también.

Respuesta

22

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

Se reduce a:

  • hacer una serie de iconos cada uno de los cuales representan una trama de animación.
  • cambiando los iconos en la bandeja en eventos de temporizador
  • crear una tira de mapa de bits. Cada trama se 16x16 píxeles
  • uso SysTray.cs

por ejemplo

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 utiliza el siguiente código para crear el marco de la animación

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

Para animar el marco StartAnimation inicia un temporizador y el temporizador de los iconos se cambian para animar la secuencia completa .

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

El uso de SysTray

Crea y alambre de su menú

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

Obtener un icono que desea mostrar de forma estática en la bandeja.

crear un objeto de SysTray con toda la información requerida

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

Crear tiras de imagen con los cuadros de animación. Para 6 franja marco de la imagen tendrá una anchura de 6 * 16 y altura de hasta 16 píxeles

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

la animación de inicio que indica cuántas veces se necesita bucle de la animación y el retraso de las tramas

m_sysTray.StartAnimation(150, 5); 

Para llamada de la parada de animación

m_sysTray.StopAnimation(); 
+4

Asegúrese de revisar los comentarios en ese artículo: "la culpa es mía :(Hay muchas fugas en el código" (http://blogs.msdn.com/b/abhinaba/archive/2005/09/12/animation-and-text-in-system-tray-using-c. aspx # 504147) –

2

Creo que la mejor manera de hacerlo es tener varios íconos pequeños que pueden continuar cambiando el objeto de la bandeja a la nueva imagen en función de la velocidad y el tiempo.

Cuestiones relacionadas