社区
界面
帖子详情
窗口绘制中paint函数为何一直被调用
gaochizhen33
2011-11-23 11:56:52
我最近在调试一个绘制窗口的源码,在绘制函数paint函数开始的位置添加短点,走到此处后按F5一直反复调用这个函数,开始的时候以为是有定时器的原因,但是仔细找也没有发现。是不是底层有什么不停发消息的机制导致该函数不停的被调用呢?
...全文
271
12
打赏
收藏
窗口绘制中paint函数为何一直被调用
我最近在调试一个绘制窗口的源码,在绘制函数paint函数开始的位置添加短点,走到此处后按F5一直反复调用这个函数,开始的时候以为是有定时器的原因,但是仔细找也没有发现。是不是底层有什么不停发消息的机制导致该函数不停的被调用呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]
讲到重点了。。就是这种情况。。能不能给个详细学习的链接? 感觉自己在这方面还很欠缺
VC++绘图编程
VC++绘图编程 在MFC应用程序
中
,一般情况下,很多绘图操作都是在视类的OnDraw()成员
函数
中
进行的. OnDraw()
函数
参数
中
自动有一个CDC的指针pDC,利用pDC
调用
CDC类的成员
函数
完成绘图操作。 另外,当用户需要立即
绘制
图像时,可以通过
调用
更新
窗口
函数
Invalidate()使Windows送出WM_
PAINT
消息自动
调用
OnDraw()
函数
来重绘图形
java
paint
方法哪个周期
调用
_[J2ME]
paint
()方法被
调用
场合及优化
paint
()方法使用场合1. 当midlet或程序的其他部分用display.setcurrent()将唯一的display交给本canvas时,
paint
()方法会自动
调用
一次。2. 当程序
中
使用canvas.re
paint
()时,
paint
()方法会
调用
一次。3. 除此之外,
paint
()并不会自动
调用
。如果将
paint
拼错,程序不会正确编译。因为
paint
()方法是canvas的一个abs...
C++实现HOOK D3D
绘制
函数
,实现透视,上色
只要是D3D游戏肯定会走D3D
绘制
函数
,学会就能干掉所有D3D,实现透视。深刻理解HOOK的原理,理解D3Dhook原理,如何关闭Z缓冲,筛选人物模型,人物上色,注入器的写法,人物模型工具的写法。
关于java
中
paint
()
函数
和re
paint
()的使用和如何清空已经
绘制
的图形内容
前言: 我当时写一个作业程序,为了搞明白这个问题,看了很多大佬的文章。之后,我结合自己实践时的体会与认识,决定写这篇文章。希望对大家有用。 关于
paint
()
函数
的使用: public void
paint
(Graphics g)
函数
一个封装在java.awt.Component
中
的
函数
。其形参为一个Graphics类的对象。也就是说继承了该类的子类都可以,都可以
调用
和覆盖该
函数
。我们也可以在Frame框架和Panel容器
中
覆盖该
函数
。这个
函数
,无需我们去主动
调用
,它会被自动
调用
一次。我们将想画的图像
QGraphicsItem的
paint
函数
的一些相关问题
在QGraphicsItem
中
,一个成员
函数
paint
(),其声明如下: void QGraphicsItem::
paint
( Q
Paint
er *
paint
er, const QStyleOptionGraphicsItem * option, QWidget * widget = 0 ) 在QGraphicsScene重绘
绘制
时,需要
调用
其
中
的每一个QGraphicsItem的pain...
界面
15,979
社区成员
115,896
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章