什么是无效,更新方法在VC++中做

Nar*_*uto 6 c++ winapi mfc windows-services visual-c++

我对c ++中的窗口函数有一点疑问.究竟是什么"invalidate()"功能呢?当我们需要调用它时,它发送了什么消息?还有什么"update()"功能?是"invalidaterect()"作品类似"invalidate()"功能?

谢谢

Tho*_*mas 7

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

有了这些Invalidate功能,这条WM_PAINT消息就会发布[ 不严格正确; 查看注释 ]到消息队列并在将来的某个时候处理.CWnd::UpdateWindow()发送(而不是发布)WM_PAINT消息,导致立即重绘无效区域.

真的,这都是在文档中.

  • 确实.不需要调用两者.通常只有在同一个线程之后会进行一些冗长的计算时才调用`UpdateWindow`,所以它不会很快回到它的消息循环.在这种情况下,您需要立即重新绘制,而不是等到更方便的时间.但一般来说,使用`Invalidate`. (3认同)
  • 实际上,"WM_PAINT"没有发布.内部标志只是在窗口管理器中设置,该标志由消息泵中的`:: Peek/GetMessage`检查.如果设置了标志且队列中没有更高优先级的消息,则在`MSG`结构中返回`WM_PAINT`. (3认同)
  • @starriet 了解为什么这样做可能会有所帮助。队列中的其他消息(例如用户输入)通常会导致更多的失效。如果像任何其他消息一样发布或发送 WM_PAINT,则程序通常会花时间绘制区域,而这些区域在绘制之前或绘制过程中排队的其他消息将立即过时。通过设置一个标志,Windows 确保消息队列为空,因此程序已达到“稳定状态”,并且所做的任何绘制可能都不会浪费精力。 (2认同)