Нарисуйте эллипс без метода OnPaint - PullRequest
1 голос
/ 06 октября 2009

Я искал учебник по GDI, но все, что я нашел, работает с методом OnPaint, который передает Paintarguments в Graphics. Я не нашел, как начать с нуля, я имею ввиду, как использовать сам класс Graphics? Вот весь код, который у меня есть, который мне не подходит:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Pen pen= new Pen(Color.Red, 3);
            Graphics g;
            g = this.CreateGraphics();
    g.DrawEllipse(pen, 150, 150, 100, 100);
        }
    }
}

Он просто ничего не делает. Я попробовал это в новой форме, ничего.

Заранее спасибо!

1 Ответ

1 голос
/ 06 октября 2009

Код, вероятно, в порядке, он рисует эллипс, как вы надеетесь. Однако после события 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 здесь.

  1. Создайте новое приложение C # winform.
  2. В 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 ();
    }
    
  3. Скомпилируйте и запустите.

...