为了避免我的代码闪烁

时间:2010-03-01 06:19:37

标签: c# .net

我在c#,

中移动鼠标时绘制矩形

我写了这样的代码,

的OnMouseMove:

Rectangle rect = new Rectangle(
    Math.Min(mouseMovePoint.X, mouseDownPoint.X), 
    Math.Min(mouseMovePoint.Y, mouseDownPoint.Y),
    Math.Abs(mouseMovePoint.X - mouseDownPoint.X), 
    Math.Abs(mouseMovePoint.Y - mouseDownPoint.Y)
);

    graphics.DrawRectangle(myPen, rect);

onmouseup:

this.Refresh();

Rectangle rect = new Rectangle(
    Math.Min(mouseMovePoint.X, mouseDownPoint.X), 
    Math.Min(mouseMovePoint.Y, mouseDownPoint.Y),
    Math.Abs(mouseMovePoint.X - mouseDownPoint.X), 
    Math.Abs(mouseMovePoint.Y - mouseDownPoint.Y)
);

graphics.DrawRectangle(myPen, rect);

但是由于这种刷新方法,当我绘制矩形时,它看起来好像在闪烁如何避免这种情况?

5 个答案:

答案 0 :(得分:3)

您似乎没有将此代码称为override of the OnPaint method of your ControlPaint event

如果是这种情况,您应该重写OnPaint方法或为Paint事件设置处理程序。

然后,在鼠标事件中,存储鼠标坐标的位置并调用Invalidate method on your Control以强制重新绘制控件。

最后,在OnPaint或Paint事件处理程序的覆盖中,您将访问在鼠标事件中设置的坐标/矩形数据,并使用传递给OnPaint的Graphics实例在那里绘制矩形方法/通过Graphics property上的PaintEventArgs class绘制事件。

答案 1 :(得分:0)

启用DoubleBuffering应解决此问题。

答案 2 :(得分:0)

结合ControlPaint.DrawReversibleFrameMouseDownMouseMove事件,使用MouseUp绘制选择框。在MSDN上查看this

答案 3 :(得分:0)

启用上述建议的双缓冲,也使用Invalidate而不是Refresh。 你应该从中获得更好的表现。

答案 4 :(得分:0)

在任何情况下,避免闪烁的传统方法是在位图上绘制所有人员(在某些情况下非常耗时),然后在绘图画布中(在快照中)发送一次位图。 尽管GDI或GDI +不是OpenGL,但就性能而言,这种方法确实提升了性能(我在实际应用程序中使用它来绘制1-10万个对象)。