Pregunta

Yo sé cómo colocar un icono en el área de notificación de Windows (bandeja del sistema).

¿Cuál es el mejor método para tener un icono animado? ¿Se puede utilizar un gif animado, o tiene que depender de un temporizador?

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

¿Fue útil?

Solución

blog de Abhinaba Basu Animación y texto en la bandeja del sistema usando C # explica.

Todo se reduce a:

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

por ejemplo.

introducir descripción de la imagen aquí

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 en los iconos se cambian para animar a toda la secuencia.

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

Uso de bandeja del sistema

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.

Crea 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);

Crea tiras de imagen con los cuadros de animación. Para 6 tira marco la imagen tendrá una anchura de 6 * 16 y la altura como 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);

Iniciar la animación que indica cuántas veces se necesita bucle de la animación y el retardo de cuadro

m_sysTray.StartAnimation(150, 5);

Para detener la animación llamada

m_sysTray.StopAnimation();

Otros consejos

Creo que la mejor manera de hacer esto es tener varios pequeños iconos que se pueden seguir para cambiar la bandeja del sistema objeto de la nueva imagen basada en la velocidad y el tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top