Лучший способ нарисовать что-то быстро меняющееся - использовать концепцию, известную как двойная буферизация. Это действительно легко сделать самостоятельно, и вам не нужно полагаться на флаг двойной буферизации. Делая это самостоятельно, вы получаете полную свободу и контроль.
По сути, вместо того, чтобы рисовать на самой Форме, вы делаете все свои рисунки на закадровом растровом изображении. Вы рисуете только тогда, когда знаете, что что-то изменилось (в вашем случае это событие перемещения мыши). Вы рисуете на экране только тогда, когда знаете, что это нужно (после перемещения мыши или когда возникает событие Paint).
private void DrawScene(Point mouseLocation)
{
myGraphics.Clear(Color.White)
myGraphics.DrawEllipse(skyBluePen, mouseLocation.X - 150, mouseLocation.Y - 150, 300, 300);
myDrawingSurface.Refresh(); //myDrawingSurface can be a Form or a PictureBox or whatever you'd like. Normally, you'd only Invalidate areas that have changed
}
private void myDrawingSurface_MouseMove(object sender, MouseEventArgs e)
{
DrawScene(e.Location);
}
private void myDrawingSurface_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(myBitmap, 0, 0); //Can't remember the exact signature
}
Еще один «читерский» способ сделать это - просто назначить свойство PictureBox для изображения, на котором вы рисуете, и вызвать команду «Обновить» в PictureBox. Он будет обрабатывать рисование своего изображения на экране для вас. Обработчик рисования не требуется.
Примечание. Вам нужно объявить myBitmap и myGraphics один раз. Растровое изображение должно быть воссоздано в соответствующем размере, когда поверхность чертежа изменит размер. Кроме того, НЕ продолжайте повторно объявлять перья и другие графические объекты снова и снова. Они должны быть объявлены один раз, когда ваша программа запускается. И утилизируйте их правильно, когда ваша программа закрывается.