2010-02-02 75 views
6

我对C++中的窗口函数有些怀疑。 究竟"invalidate()"函数做什么? 它发送什么信息?当我们需要调用它时? "update()"功能又是什么? 是"invalidaterect()"的作用类似于"invalidate()"的功能?什么是无效的,更新方法在VC++中做什么

感谢

回答

6

CWnd::Invalidate()使窗口的整个客户区失效,这表示该区域已过期,应该重新绘制。您通常会在需要重绘的控件上调用它。 CWnd::InvalidateRect()仅使窗口的一部分无效。

随着Invalidate功能,WM_PAINT消息将张贴[不严格;请参阅评论]到消息队列并在将来的某个时间点处理。 CWnd::UpdateWindow()发送(而不是帖子)WM_PAINT消息,导致无效区域立即重新绘制。

真的,这一切都在文档中。

+0

你的意思是,我们不应该在应用程序权限中的一个实例中调用“Invalidate”或“CWnd :: UpdateWindow()” ? 我们需要调用其中一个正确的方法来获得wm_paint消息 – Naruto 2010-02-02 11:58:10

+3

确实如此。调用两者都不是必需的。只有当相同的线程在之后做了一些冗长的计算时,你通常才会调用'UpdateWindow',所以它不会很快回到它的消息循环。在这种情况下,你想立即重绘,不要等到更方便的时候。但一般来说,使用'Invalidate'。 – Thomas 2010-02-02 12:01:54

+0

oh ok谢谢你.. – Naruto 2010-02-02 13:21:28

1

的无效功能标记为无效绘图区域。当窗口重新绘制时使用该标志,如果该区域失效,则将重新绘制该区域,否则将仅保持原来的屏幕区域。 invalidate使给定对象的整个客户区失效,invalidaterect使客户区的特定区域无效。更新函数进行实际重绘。

这样一个机制的原因,而不是仅仅当你知道某些东西需要改变时立即绘制,就是你可以防止多次重绘,比如说你一次接收到三个keydown消息,它们滚动一些文本区域。如果您为每个按键重新绘制文本区域,则必须绘制文本区域三次,并且应用程序将无响应。通过代替处理所有关键事件,在重绘textarea之前更新附加到文本区域的数据结构并使文本区域无效,您只需重绘textarea一次。