窗口绘制中paint函数为何一直被调用

gaochizhen33 2011-11-23 11:56:52
我最近在调试一个绘制窗口的源码,在绘制函数paint函数开始的位置添加短点,走到此处后按F5一直反复调用这个函数,开始的时候以为是有定时器的原因,但是仔细找也没有发现。是不是底层有什么不停发消息的机制导致该函数不停的被调用呢?
...全文
271 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaochizhen33 2011-12-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
[/Quote]
OK 结贴吧
向立天 2011-12-14
  • 打赏
  • 举报
回复
您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面界面版关于版主结帖工作的具体办法
wltg2001 2011-11-23
  • 打赏
  • 举报
回复
我最近在调试一个绘制窗口的源码,在绘制函数paint函数开始的位置添加短点,走到此处后按F5一直反复调用这个函数,
===============
一般不对OnPaint函数下断点,因为断下来的时候窗口不见了,再要显示窗口时因为又有无效区了,所以又会调用OnPaint,又断下来了,你会一直停在OnPaint中出不去。
VC天下 2011-11-23
  • 打赏
  • 举报
回复
1. 系统何时发送WM_PAINT消息?
系统会在多个不同的时机发送 WM_PAINT 消息:当第一次创建一个窗口时,当改变窗口的大小时,当把窗口从另一个
窗口背后移出时,当最大化或最小化窗口时,等等,这些动作都是由 系统管理的,应用只是被动地接收该消息,在消息处理函数中进行绘制操作;大多数的时候应用也需要能够主动引发窗口中的绘制操作,比如当窗口显示的数据改变 的时候,这一般是通过 InvalidateRect 和 InvalidateRgn 函数来完成的。


InvalidateRect 和 InvalidateRgn把指定的区域加到窗口的 Update Region 中,当应用的消息队列没有其他
消息时,如果窗口的 Update Region 不为空时,系统就会自动产生 WM_PAINT 消息。


系统为什么不在调用 Invalidate 时发送 WM_PAINT 消息呢?又为什么非要等应用消息队列为空时才发送WM_PAINT 消息呢?这是因为系统把在窗口中的绘制操作当作一种低优先级的操作,于是尽可能地推后做。


不过这样也有利于提高绘制的效率:两个 WM_PAINT 消息之间通过 InvalidateRect 和InvaliateRgn 使之失效
的区域就会被累加起来,然后在一个 WM_PAINT 消息中一次得到 更新,不仅能避免多次重复地更新同一区域,也优化了
应用的更新操作。
这种通过 InvalidateRect 和 InvalidateRgn 来使窗口区域无效,依赖于系统在合适的时机发送 WM_PAINT
消息的机 制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送 WM_PAINT 消息之间是有延迟的;有时候
这种延迟并不是我们希望的,这时我们当然可以在无效化窗口区域后利用 SendMessage 发送一条 WM_PAINT消息来强
制立即重画,但不如使用 Windows GDI 为我们提供的更方便和强大的函数: UpdateWindow 和 RedrawWindow。


UpdateWindow 会检查窗口的 Update Region,当其不为空时才发送 WM_PAINT 消息; RedrawWindow 则给我
们更多的控制:是否重画非客户区和背景,是否总是发送 WM_PAINT 消息而不管 Update Region 是否为空等。
gaochizhen33 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
你先要知道在什么机制下系统会发WM_PAINT消息到应用程序
[/Quote]
能讲解下么或是给个学习链接。我现在就是想知道发送机制和导致频繁发送的原因。
Eleven 2011-11-23
  • 打赏
  • 举报
回复
你先要知道在什么机制下系统会发WM_PAINT消息到应用程序
Lindsay 2011-11-23
  • 打赏
  • 举报
回复
Onsize呢?是不是和Onpaint一样啊?
gaochizhen33 2011-11-23
  • 打赏
  • 举报
回复
搜噶 谢谢大家了 我再去查查别的资料 多学学这方面的内容
诶呦 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wltg2001 的回复:]

我最近在调试一个绘制窗口的源码,在绘制函数paint函数开始的位置添加短点,走到此处后按F5一直反复调用这个函数,
===============
一般不对OnPaint函数下断点,因为断下来的时候窗口不见了,再要显示窗口时因为又有无效区了,所以又会调用OnPaint,又断下来了,你会一直停在OnPaint中出不去。
[/Quote]
++
所以在调试的时候先不要给OnPaint加断点,当运行到你要检测的程序的时候,在加断点,调试完了在取消断点再继续运行
用户 昵称 2011-11-23
  • 打赏
  • 举报
回复
在调试时当然会被反复调用了,因为窗口每次都要重复刷新一次。
gaochizhen33 2011-11-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wltg2001 的回复:]
我最近在调试一个绘制窗口的源码,在绘制函数paint函数开始的位置添加短点,走到此处后按F5一直反复调用这个函数,
===============
一般不对OnPaint函数下断点,因为断下来的时候窗口不见了,再要显示窗口时因为又有无效区了,所以又会调用OnPaint,又断下来了,你会一直停在OnPaint中出不去。
[/Quote]
讲到重点了。。就是这种情况。。能不能给个详细学习的链接? 感觉自己在这方面还很欠缺

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧