Как рисовать на панели, чтобы она не мигала? - PullRequest
3 голосов
/ 24 января 2011

Это мой код. Когда я перемещаю курсор над формой, она работает, круг движется, но мигает. Как я могу это исправить?

public partial class Preprocesor : Form
{
    int x, y;
    Graphics g;

    public Preprocesor()
    {
        InitializeComponent();
    }

    private void Preprocesor_Load(object sender, EventArgs e)
    {
        g = pnlMesh.CreateGraphics();
    }

    private void pnlMesh_Paint(object sender, PaintEventArgs e)
    {
        g.Clear(Color.White);
        g.FillEllipse(Brushes.Black, x, y, 10, 10);
    }

    private void pnlMesh_MouseMove(object sender, MouseEventArgs e)
    {
        x = e.X;
        y = e.Y;
        pnlMesh.Invalidate();
    }
}

Ответы [ 2 ]

5 голосов
/ 24 января 2011

Вам необходимо использовать элемент управления с двойной буферизацией.

Создайте класс, который наследует Control и устанавливает DoubleBuffered = true; в конструкторе (это защищенное свойство).
Используйте этот элемент управления вместо панели, чтобы не было мерцания.

Кроме того, вы не должны хранить объект Graphics для дальнейшего использования.
Вместо этого вы должны рисовать e.Graphics в обработчике Paint.

4 голосов
/ 24 января 2011

Как насчет отмены пользовательского элемента управления панели и установки Doublebuffered в true?

public partial class BufferPanel : Panel
{
    public BufferPanel()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        UpdateStyles();
    }
}
...