Проблема с переопределением OnPaint, когда DoubleBuffered имеет значение true - PullRequest
1 голос
/ 15 июля 2010

Я создал пользовательский элемент управления, производный от Panel.Я использую его для отображения изображения, используя свойство BackgroundImage.Я переопределяю метод OnClick и устанавливаю isSelected в true, затем вызываю метод Invalidate и рисую прямоугольник в переопределенном OnPaint.Все идет хорошо, пока я не установил DoubleBuffered в true.Прямоугольник рисуется, а затем стирается, и я не могу понять, почему это происходит.

public CustomControl()
    : base()
{
    base.DoubleBuffered = true;

    base.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true);
}

protected override void OnPaint(PaintEventArgs pe)
{
    base.OnPaint(pe);

    PaintSelection();
}

private void PaintSelection()
{
    if (isSelected)
    {
        Graphics graphics = CreateGraphics();
        graphics.DrawRectangle(SelectionPen, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1);
    }
}

1 Ответ

6 голосов
/ 15 июля 2010

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

Краска для Graphics передается в PaintEventArgs вместо:

protected override void OnPaint(PaintEventArgs pe)
{
    base.OnPaint(pe);
    PaintSelection(pe.Graphics);
}

private void PaintSelection(Graphics graphics)
{
    if (isSelected)
    {
        graphics.DrawRectangle(SelectionPen, DisplayRectangle.Left, DisplayRectangle.Top, DisplayRectangle.Width - 1, DisplayRectangle.Height - 1);
    }
}
...