taskbarnotification hardcodet c# wpf system-tray notifyicon trayicon

c# - hardcodet - Animación de icono de bandeja



hardcodet wpf taskbarnotification (2)

Sé cómo colocar un ícono en el área de notificación de Windows (bandeja del sistema).

¿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.


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


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

Todo se reduce a:

  • hacer una serie de íconos, cada uno de los cuales representa un cuadro de animación.
  • cambiar los íconos en la bandeja en los eventos del temporizador
  • crea una tira de mapa de bits. Cada fotograma tiene 16x16 píxeles
  • usa SysTray.cs

p.ej

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 cuadro, StartAnimation inicia un temporizador y en el temporizador se cambian los iconos para animar 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++; } .... }

Usando SysTray

Crea y conecta tu menú

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

Obtenga un ícono que quiera mostrar estáticamente en la bandeja.

Crea un objeto 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 bandas de marco, la imagen tendrá un ancho de 6 * 16 y una altura de 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);

Comience la animación que indica cuántas veces necesita repetir la animación y el retraso del cuadro

m_sysTray.StartAnimation(150, 5);

Para detener la llamada de animación

m_sysTray.StopAnimation();