1

Находил только варианты проанимировать иконку в трее лишь с помощью использования нескольких иконок, каждая из которых будет являться одним из кадров анимации. К примеру, как здесь.

Интересует тот же результат, только с использование одной иконки. На эту тему нашёл лишь пример на C++.

Как сделать нечто такое на C#?

Raf-9600
  • 331

2 Answers2

5

Как по-твоему, сколько иконок будет, если анимацию не делать? Убираешь из примера с анимацией лишние иконки и таймер и получается именно то, о чём ты спрашиваешь.

Мне анимация нужна в виде движения по кругу.

Значит складываешь в массив повёрнутые на разный угол иконки и последовательно их меняешь как в той анимации. Можно либо заранее заготовить набор повёрнутых иконок, либо поворачивать их программно (например, так).

Qwertiy
  • 123,725
  • Не совсем. Мне анимация нужна в виде движения по кругу. Если в примере оставить только одну иконку и удалить таймер, то за счёт чего иконка будет вращаться? – Raf-9600 Jan 21 '16 at 06:27
  • @Raf-9600, неправильно вопрос понял. Ответ дополнен. – Qwertiy Jan 21 '16 at 06:48
  • Благодарю. Оказывается я не про то гуглил. Нужно было про вращение изображений, а я искал именно вращение иконки. Тупанул в общем. С помощью кода по вашей ссылке всё получилось. Однако почему-то со временем приложение начало отъедать оперативную память. В моём случае не существенно, но всё же странно... Это нормально? – Raf-9600 Jan 22 '16 at 19:21
  • @Raf-9600, нет. – Qwertiy Jan 22 '16 at 19:34
0

На случай если ещё кому-то понадобится вращать одну иконку в области уведомлений (system tray), вот готовая реализация. Пришёл к ней благодаря ссылке выше от Qwertiy и небольшому гуглению. Некоторая проблема в коде состоит лишь в том, что со временем он пожирает оперативную память. Для system tray icon это незначительно, но если с помощью этого кода вращать более увесистые изображения, то потеря памяти будет заметней. Я не знаю насколько это нормально и можно ли предотвратить.

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

namespace ImgRotate
{
    public partial class Form1 : Form
    {
        Bitmap btmpIcn;
        public Form1()
        {
            InitializeComponent();
            timer1.Enabled = true;
            btmpIcn = notifyIcon1.Icon.ToBitmap();
        }

        int an;
        private void timer1_Tick(object sender, EventArgs e)
        {
            if (an >= 350)
                an = 0;
            else
                an += 10;

            notifyIcon1.Icon = Icon.FromHandle(RotateImage(btmpIcn, an).GetHicon());
        }

        /// <summary>
        /// method to rotate an image either clockwise or counter-clockwise
        /// </summary>
        /// <param name="img">the image to be rotated</param>
        /// <param name="rotationAngle">the angle (in degrees).
        /// NOTE: 
        /// Positive values will rotate clockwise
        /// negative values will rotate counter-clockwise
        /// </param>
        /// <returns></returns>
        public static Bitmap RotateImage(Image img, float rotationAngle)
        {
            //create an empty Bitmap image
            Bitmap bmp = new Bitmap(img.Width, img.Height);

            //turn the Bitmap into a Graphics object
            Graphics gfx = Graphics.FromImage(bmp);

            //now we set the rotation point to the center of our image
            gfx.TranslateTransform((float)bmp.Width / 2, (float)bmp.Height / 2);

            //now rotate the image
            gfx.RotateTransform(rotationAngle);

            gfx.TranslateTransform(-(float)bmp.Width / 2, -(float)bmp.Height / 2);

            //set the InterpolationMode to HighQualityBicubic so to ensure a high
            //quality image once it is transformed to the specified size
            gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;

            //now draw our new image onto the graphics object
            gfx.DrawImage(img, new Point(0, 0));

            //dispose of our Graphics object
            gfx.Dispose();

            //return the image
            return bmp;
        }
    }
}
Raf-9600
  • 331
  • "Некоторая проблема в коде состоит лишь в том, что со временем он пожирает оперативную память." - задай отдельным вопросом - отвечу. – Qwertiy Jan 22 '16 at 19:33
  • Задал http://ru.stackoverflow.com/questions/485198 – Raf-9600 Jan 22 '16 at 19:49