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