如何让窗口重画——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)做到。
注意最后两个按钮产生效果的区别。为什么会这样?
这里注意这样几点(这里讨论的函数都是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
注意最后两个按钮产生效果的区别。为什么会这样?
- 如何让窗口重画——Invalidate()、SendMessage(WM_PAINT)和UpdateWindow()
- Invalidate、InvalidateRect和UpdateWindow
- Invalidate 和 UpdateWindow 小记
- Invalidate()和UpdateWindow( )区别
- 关于Invalidate和UpdateWindow
- UpdateWindow和Invalidate
- Invalidate 和 UpdateWindow
- 窗口刷新 Invalidate UpdateWindow RedrawWindow
- 窗口刷新 Invalidate UpdateWindow RedrawWindow
- MFC点点滴滴——Invalidate/InvalidateRect/UpdateWindow
- Invalidate和UpdateWindow的区别
- 对Invalidate()和updateWindow 理解
- Invalidate和UpdateWindow的区别
- UpdateData、Invalidate、InvalidateRect和UpdateWindow
- 关于Invalidate、InvalidateRect和UpdateWindow
- UpdateWindow和Invalidate的区别
- UpdateData、Invalidate、InvalidateRect和UpdateWindow
- 关于Invalidate、InvalidateRect和UpdateWindow
- Lucene01---几个概念理解
- 最近遇到問題的總結!
- [C++] 如何静态链接imagemagick
- webbrowser控件属性介绍
- qemu
- 如何让窗口重画——Invalidate()、SendMessage(WM_PAINT)和UpdateWindow()
- IOS使用UIImageView显示gif动画的例子
- 笔记本安装系统常见问题
- MFC中动态添加菜单项和响应菜单事件
- 利用maven创建spring-osgi powered 多bundle工程
- object-c 内存里面压缩与解压缩的函数
- MFC中动态创建N级菜单以及响应事件
- Common下StringHelper.cs
- 程序开发规范