【发布时间】:2020-08-07 17:47:37
【问题描述】:
我应该使用Control.Invalidate() 还是最好使用Control.Invalidate(Rectangle)? MSDN 对这些方法的信息有点缺乏。
在这两种情况下,都会调用相同的OnPaint 方法并执行相同的代码行。那么这里有什么区别,除了我必须计算矩形结构来告诉windows应该重绘哪个区域?
我觉得我一直使用Control.Invalidate() 会更安全,但同时我觉得我编写了糟糕的代码并失去了性能。
【问题讨论】:
-
如果你想使整个事情无效,只使用 Invalidate()。如果只想使控件的一部分无效,请使用 Rectangle 方法。这只是一种优化技术。单独使用 Invalidate() 应该没问题。大多数情况下,这些东西都是双缓冲的,据我所知,整个东西都会被重新绘制。我认为
InvalidateRect的东西是 CPU 和 GPU 能力非常有限的时期的产物。现在真的不是这样了,尤其是 GDI。 -
Invalidate(Rectangle) 仅在您可以在 Paint 事件中重绘部分区域时才有意义。如果总是重绘整个区域,那就没有意义了。
-
@AlexanderPetrov,这不是真的。您总是在
Paint事件处理程序中完成所有绘图。这与Invalidate完全无关。您每次都进行所有绘图,然后只有落入无效区域的绘图部分实际上被绘制到屏幕上。是绘画部分,而不是绘画部分,这很慢。