我有一个组件,一个继承的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();
答案 0 :(得分:1)
请尝试使用ControlStyles.OptimizedDoubleBuffered
。它更快,通常效果更好。确保ControlStyles.AllPaintingInWmPaint
和ControlStyles.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();
}
}