如何让窗口重画——Invalidate()、SendMessage(WM_PAINT)和UpdateWindow()

来源:互联网 发布:零基础学大数据算法pdf 编辑:程序博客网 时间:2024/06/06 00:09
昨天晚上讨论的问题,还有另外一个很重要的部分——如何让窗口重画。


这里注意这样几点(这里讨论的函数都是CWnd对象的成员函数):


@1.Invalidate()函数只是标记窗口区域需要重画,但不意味着窗口会被直接重画。它只会在下一个WM_PAINT消息被接收到时,调用OnPaint()才被重画。


@2.当窗口的“消息队列中没有其他消息”且“窗口需要被重画的区域不为空时”,Windows系统会自动向窗口发送WM_PAINT消息,引发窗口的重画(这解释了为什么有时我们不需要自己调用SendMessage(WM_PAINT);)


@3.当窗口区域在被Invalidate()掉后,并且在WM_PAINT消息接收到之前,我们仍然可以调用ValidateRect(NULL)来取消掉这次窗口重画。


@4.当你需要让窗口在Invalidate()后立即重画,标准的做法应该是Invalidate()之后马上调用UpdateWindow(),这样窗口会立即把自己重画一次。


@5.UpdateWindow()的实现方式,仍然是对窗口的Client area发送一个WM_PAINT消息,这个机制也可以用SendMessage(WM_PAINT)做到。

http://kcclub.kingsoft.com/forum.php?mod=attachment&aid=NjU2fDZhYWQ3OTI0fDEzMzE3MDU3ODh8OTM%3D

附件程序是对上述说法的演示程序,程序中在OnPaint()函数中添加了代码,用TextOut函数输出OnPaint被调用了多少次。
注意最后两个按钮产生效果的区别。为什么会这样?
原创粉丝点击