Код, вероятно, в порядке, он рисует эллипс, как вы надеетесь. Однако после события Load будет PaintBackground
событие и PaintEvent
в качестве формы. PaintBackground
по умолчанию удалит содержимое элемента управления, эффективно удалив только что нарисованный эллипс.
Картина состоит из двух этапов:
for each (region in set of regions that need updating)
{
PaintBackground (region)
Paint (region)
}
Диспетчер окон перерисовывает только те части элемента управления, которые требуют обновления, если содержимое элемента управления не изменилось или никакое действие пользователя не изменило видимость элемента управления, тогда рисование не выполняется.
Итак, почему вы хотите нарисовать эллипс в методе Load? Обычно вы хотите нарисовать что-то только тогда, когда нужно что-то нарисовать, и ваша форма сообщается, когда что-то нужно рисовать в событиях PaintBackground
и Paint
.
Вы беспокоитесь о мерцании? Или это проблема скорости? Эллипсы быстро рисуются. Мерцание, однако, сложнее исправить. Вам необходимо создать растровое изображение, нарисовать растровое изображение и добавить растровое изображение к элементу управления во время события Paint. Кроме того, заставьте событие PaintBackground
ничего не делать - не стирайте элемент управления, это мерцание вызывает мерцание.
РЕДАКТИРОВАТЬ: Например, я использую DevStudio 2005 здесь.
- Создайте новое приложение C # winform.
В Form1.cs добавить следующее:
protected override void OnPaintBackground (PaintEventArgs e)
{
// do nothing! prevents flicker
}
protected override void OnPaint (PaintEventArgs e)
{
e.Graphics.FillRectangle (new SolidBrush (BackColor), e.ClipRectangle);
Point
mouse = PointToClient (MousePosition);
e.Graphics.DrawEllipse (new Pen (ForeColor), new Rectangle (mouse.X - 20, mouse.Y - 10, 40, 20));
}
protected override void OnMouseMove (MouseEventArgs e)
{
base.OnMouseMove (e);
Invalidate ();
}
Скомпилируйте и запустите.