Анимация значка в трее
-
05-09-2019 - |
Вопрос
Я знаю, как разместить значок в области уведомлений Windows (системный трей).
Каков наилучший способ анимировать иконку?Можете ли вы использовать анимированный gif-файл или вам приходится полагаться на таймер?
Я использую C # и WPF, но WinForms тоже принимаются.
Решение
Запись в блоге Абхинабы Басу Анимация и текст в системном трее с использованием C# объясняет.
Все сводится к:
- создание массива значков, каждый из которых представляет собой анимационный кадр.
- переключение значков в трее при включении событий таймера
- создайте растровую полосу.Каждый кадр имеет размер 16x16 пикселей
- использование Системный файл.cs
например ,
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();
Другие советы
Я думаю, что лучший способ сделать это - иметь несколько маленьких значков, с помощью которых вы можете продолжать изменять объект systray на новое изображение в зависимости от скорости и времени.