Способ уменьшения мерцания – использовать двойную буферизацию вывода – когда изображение сначала готовится "за кадром", а затем переносится на экран, устраняя мерцание при анимации. Рассмотрим пример вывода с двойной буферизацией:
using System.Threading; //добавляем для использования задержки
private void Form1_Paint(Object sender, PaintEventArgs e) {
//Graphics g = e.Graphics;
Graphics displayGraphics = e.Graphics;
int k=0;
while(k <500) {
Pen p = new Pen(Color.Red);
SolidBrush b= new SolidBrush(Color.Yellow);
SolidBrush b1= new SolidBrush(Color.Green);
//создаем объект - изображение, которое будет включать все, что нарисовано на форме
Image i = new Bitmap(Control.Height,Control.Width);
Graphics g = Graphics.FromImage(i);
g.Clear(Color.Aqua);
Thread.Sleep(200); //задержка на 300 миллисекунд
g.FillEllipse(b,k,150,30,45);
g.FillEllipse(b1,k+5,165,5,5);
g.FillEllipse(b1,k+20,165,5,5);
g.DrawArc(p,k+5,175,20,10,0,180);
g.FillRectangle(b1,0,190,500,100);
k=k+10;
//выводим на форму, созданное изображение
displayGraphics.DrawImage(i,ClientRectangle);
}
}
Для сравнения закомментируйте строки выделенные красным цветом и снимите комментарий со строки: Graphics g = e.Graphics;
Процесс анимации можно выполнять по таймеру.