Анимированная панель в прогресс-баре winform - PullRequest
4 голосов
/ 10 марта 2012

В настоящее время я пишу расширенное управление индикатором выполнения, на 100% открытый исходный код, и я создал несколько основных стилей с градиентами и сплошными цветами.

Одним из вариантов, которые я хотел добавить, была анимация дляБар, прет очень похожий на Windows 7 и Vista, зеленый индикатор выполнения.Поэтому мне нужно добавить движущееся «Glow» к% bar, однако моя попытка этого выглядит ужасно.

Мой метод - нарисовать эллипс с заданным размером и переместить его в позицию x, пока он не достигнет конца.анимация начинается снова.

Во-первых, есть ли у кого-нибудь ссылки или код, чтобы помочь мне достичь текущего эффекта свечения Windows 7 с помощью GDI или подобного метода?

У меня есть несколько других анимаций, которые будуттакже добавьте бар, следовательно, GDI.

 private void renderAnimation(PaintEventArgs e)
    {
        if (this.AnimType == animoptions.Halo)
        {                
            Rectangle rec = e.ClipRectangle;
            Rectangle glow = new Rectangle();
            //SolidBrush brush = new SolidBrush(Color.FromArgb(100, Color.White));
            //int offset = (int)(rec.Width * ((double)Value / Maximum)) - 4;
            int offset = (int)(rec.Width / Maximum) * Value;

            if (this.animxoffset > offset)
            {
                this.animxoffset = 0;
            }
            glow.Height = rec.Height - 4;
            if (this.animxoffset + glow.X > offset)
            {
                glow.Width = offset - (this.animxoffset + 50);
            }
            else
            {
                glow.Width = 50;
            }


            glow.X = this.animxoffset;
            LinearGradientBrush brush = new LinearGradientBrush(glow, Color.FromArgb(0, Color.White), Color.FromArgb(100, Color.White), LinearGradientMode.Horizontal);
            e.Graphics.FillEllipse(brush, this.animxoffset, 2, glow.Width, glow.Height);
            brush.Dispose();

            string temp = offset.ToString();

            e.Graphics.DrawString(temp + " : " + glow.X.ToString(), DefaultFont, Brushes.Black, 2, 2);


            animTimer = new System.Timers.Timer();
            animTimer.Interval = 10;
            animTimer.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
            animTimer.Start();
        }
    } 
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        this.animTimer.Stop();
        this.animxoffset += 2;
        Invalidate();


    }

1 Ответ

0 голосов
/ 21 апреля 2015

Это просто пример свечения, повторяющегося в массиве пера.Вы также можете использовать прозрачное изображение (хотя это может повлиять на производительность).

        Pen[] gradient = { new Pen(Color.FromArgb(255, 200, 200, 255)), new Pen(Color.FromArgb(150, 200, 200, 255)), new Pen(Color.FromArgb(100, 200, 200, 255)) };
        int x = 20;
        int y = 20;
        int sizex = 200;
        int sizey = 10;
        int value = 25;


        //draw progress bar basic outline (position - 1 to compensate for the outline)
        e.Graphics.DrawRectangle(Pens.Black, new Rectangle(x-1, y-1, sizex, sizey));

        //draw the percentage done
        e.Graphics.FillRectangle(Brushes.AliceBlue, new Rectangle(x, y, (sizex/100)*value, sizey));

        //to add the glow effect just add lines around the area you want to glow.
        for (int i = 0; i < gradient.Length; i++)
        {
            e.Graphics.DrawRectangle(gradient[i], new Rectangle(x - (i + 1), y - (i + 1), (sizex / 100) * value + (2 * i), sizey + (2 * i)));
        }
...