我在c#,
中移动鼠标时绘制矩形我写了这样的代码,
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);
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);
但是由于这种刷新方法,当我绘制矩形时,它看起来好像在闪烁如何避免这种情况?
答案 0 :(得分:3)
您似乎没有将此代码称为override of the OnPaint method of your Control或Paint event。
如果是这种情况,您应该重写OnPaint方法或为Paint事件设置处理程序。
然后,在鼠标事件中,存储鼠标坐标的位置并调用Invalidate method on your Control以强制重新绘制控件。
最后,在OnPaint或Paint事件处理程序的覆盖中,您将访问在鼠标事件中设置的坐标/矩形数据,并使用传递给OnPaint的Graphics实例在那里绘制矩形方法/通过Graphics property上的PaintEventArgs class绘制事件。
答案 1 :(得分:0)
启用DoubleBuffering应解决此问题。
答案 2 :(得分:0)
结合ControlPaint.DrawReversibleFrame
,MouseDown
和MouseMove
事件,使用MouseUp
绘制选择框。在MSDN上查看this。
答案 3 :(得分:0)
启用上述建议的双缓冲,也使用Invalidate而不是Refresh。 你应该从中获得更好的表现。
答案 4 :(得分:0)
在任何情况下,避免闪烁的传统方法是在位图上绘制所有人员(在某些情况下非常耗时),然后在绘图画布中(在快照中)发送一次位图。 尽管GDI或GDI +不是OpenGL,但就性能而言,这种方法确实提升了性能(我在实际应用程序中使用它来绘制1-10万个对象)。