Анимация иконки в трее - PullRequest
       30

Анимация иконки в трее

16 голосов
/ 18 февраля 2009

Я знаю, как разместить значок в области уведомлений Windows (системный трей).

Как лучше всего анимировать иконку? Можете ли вы использовать анимированный GIF, или вы должны полагаться на таймер?

Я использую C # и WPF, но WinForms тоже принимаются.

Ответы [ 2 ]

23 голосов
/ 26 февраля 2009

Сообщение в блоге Абхинабы Басу Анимация и текст в системном трее с использованием C # , объясняет.

Это сводится к:

  • создание массива иконок, каждая из которых представляет кадр анимации.
  • переключение значков в трее на события таймера
  • создать растровую полосу. Каждый кадр 16x16 пикселей
  • использовать SysTray.cs

например.

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 использует следующий код для создания кадра анимации

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

Для анимации кадра StartAnimation запускает таймер, а в таймере значки меняются для анимации всей последовательности.

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

Использование SysTray

Создайте и подключите ваше меню

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

Получите значок, который вы хотите статически показывать в трее.

Создание объекта SysTray со всей необходимой информацией

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

Создание полос изображения с кадрами анимации. Для 6-кадровой полосы изображение будет иметь ширину 6 * 16 и высоту 16 пикселей

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

Для остановки анимации звоните

m_sysTray.StopAnimation();
3 голосов
/ 18 февраля 2009

Я думаю, что лучший способ сделать это - это иметь несколько маленьких значков, которые вы можете продолжать изменять объект systray на новое изображение, основываясь на скорости и времени.

...