Panel DoubleBuffered属性停止了绘图,是不可见的

时间:2011-03-01 13:26:29

标签: c# winforms drawing gdi panel

我有一个组件,一个继承的Panel,我在其中覆盖OnPaint事件以绘制500点的图形。由于我需要在图表上做一些选择,它会闪烁。我找到了这个DoubleBuffered属性但是当我将它设置为True时,在面板构造函数中,绘图消失了。我调试它,我发现绘图方法仍然执行但面板上没有任何内容。 有谁知道为什么会发生这种情况?

这是.NET 3.5 - C#。 Winforms应用程序

        try
        {
            Graphics g = e.Graphics;

            //Draw _graphArea:
            g.DrawRectangle(Pens.Black, _graphArea);

            _drawingObjectList.DrawGraph(g, _mainLinePen, _diffLinePen, _dotPen, _dotBrush, _notSelectedBrush, _selectedBrush);

            DrawSelectionRectangle(g);

            g.Dispose();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

Panel descendant constructor:

        this.BackColor = Color.White;
        this.SetStyle(ControlStyles.ResizeRedraw, true);
        this.SetStyle(ControlStyles.UserPaint, true);
        this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
        this.UpdateStyles(); 

1 个答案:

答案 0 :(得分:1)

请尝试使用ControlStyles.OptimizedDoubleBuffered。它更快,通常效果更好。确保ControlStyles.AllPaintingInWmPaintControlStyles.UserPaint也已启用。

现在,OnPaint()应该是绘制到窗口的唯一内容,并且只能通过失效或使用Refresh()来调用此方法;你绝不能自己打电话给OnPaint()。不要处置Graphics对象。如果您在任何这些情况下失败,可能会出现闪烁和各种其他绘图错误。

class MyControl : UserControl
{
    public MyControl()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint, true);
        SetStyle(ControlStyles.UserPaint, true);
        SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
    }

    protected override void  OnPaint(PaintEventArgs e)
    {
        e.Graphics.Clear(Color.Red);
    }

    void RandomEventThatRequiresRefresh(object sender, EventArgs e)
    {
        Refresh();
    }
}