OnEraseBkGnd与OnPaint的联系是什么?

jingss_3 2009-10-12 02:59:03
OnEraseBkGnd与OnPaint的联系是什么?
...全文
6811 60 打赏 收藏 转发到动态 举报
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
tongdawp 2012-08-11
  • 打赏
  • 举报
回复
回答太给力了!

[Quote=引用 2 楼 的回复:]
问题是这样产生的.在OnEraseBkGnd中,如果你不调用原来缺省
的OnEraseBkGnd只是重画背景则不会有闪烁.而在OnPaint里面,
由于它隐含的调用了OnEraseBkGnd,而你又没有处理OnEraseBkGnd
函数,这时就和窗口缺省的背景刷相关了.缺省的
OnEraseBkGnd操作使用窗口的缺省背景刷刷新背景(一般情况
下是白刷),而随后你又自己重画背景……
[/Quote]
zhiweishq 2011-08-12
  • 打赏
  • 举报
回复
如果这个成立,那使用双缓冲画图的话也出现闪屏也就解析通了
zhiweishq 2011-08-12
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 adrom 的回复:]
首先,tr0j4n是好心人,写得这么长。但好像不对哦。

应该是这样的吧,当Windows确定客户区需要重绘时,它首先发送WM_ERASEBKGND消息给窗口过程,由WM_ERASEBKGND消息的默认处理用白色画刷刷除背景,然后再发送WM_PAINT消息给窗口过程,由WM_PAINT消息的响应程序负责绘画客户区内容。或者说,当Windows确定客户区需要重绘时,它分别发送WM_ERASEBK……
[/Quote]
感觉后面说的有点对,在Onpaint的前后都加上一个判断OnPaint是否完成的判断,如果Onpaint完成,才执行InvalidateRect,之后还出现闪屏,就只能说是InvalidateRect后,Onpaint还没完全执行而没显示才出现闪屏
cduoa 2011-04-10
  • 打赏
  • 举报
回复
好强!
zhutouailanzhu 2011-03-30
  • 打赏
  • 举报
回复
学习了,谢谢无私奉献,顶一个
birdsinging 2011-01-27
  • 打赏
  • 举报
回复
[Quote=引用 52 楼 adrom 的回复:]
首先,tr0j4n是好心人,写得这么长。但好像不对哦。

应该是这样的吧,当Windows确定客户区需要重绘时,它首先发送WM_ERASEBKGND消息给窗口过程,由WM_ERASEBKGND消息的默认处理用白色画刷刷除背景,然后再发送WM_PAINT消息给窗口过程,由WM_PAINT消息的响应程序负责绘画客户区内容。或者说,当Windows确定客户区需要重绘时,它分别发送WM_ERASEBK……
[/Quote]

综合tr0j4n和你说的,受教了。继续思考中……
adrom 2011-01-25
  • 打赏
  • 举报
回复
首先,tr0j4n是好心人,写得这么长。但好像不对哦。

应该是这样的吧,当Windows确定客户区需要重绘时,它首先发送WM_ERASEBKGND消息给窗口过程,由WM_ERASEBKGND消息的默认处理用白色画刷刷除背景,然后再发送WM_PAINT消息给窗口过程,由WM_PAINT消息的响应程序负责绘画客户区内容。或者说,当Windows确定客户区需要重绘时,它分别发送WM_ERASEBKGND和WM_PAINT消息,由这两个消息的响应程序分别负责刷除背景和重画客户内容。

至闪烁的问题,是由于刷除背景以后,在WM_PAINT未执行完成之前,windows已把视频卡的缓存输出到屏幕上了。
zlei201314 2010-12-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 tr0j4n 的回复:]
问题是这样产生的.在OnEraseBkGnd中,如果你不调用原来缺省
的OnEraseBkGnd只是重画背景则不会有闪烁.而在OnPaint里面,
由于它隐含的调用了OnEraseBkGnd,而你又没有处理OnEraseBkGnd
函数,这时就和窗口缺省的背景刷相关了.缺省的
OnEraseBkGnd操作使用窗口的缺省背景刷刷新背景(一般情况
下是白刷),而随后你又自己重画背景……
[/Quote]
好人啊
GONGDALE 2010-12-12
  • 打赏
  • 举报
回复
请问各位大侠,是不是在窗口刚创建的时候就会调用OnEraseBkgnd,而并没使改变窗口大小。否则在OnEraseBkgnd中改变的背景为什么在窗口第一次创建时就会显示出来,而不是先显示白背景而后改变窗口大小后显示改变的背景?????
dj419 2010-11-25
  • 打赏
  • 举报
回复
顶,学习,膜拜
艾雨伞 2010-08-19
  • 打赏
  • 举报
回复
群英荟萃!赞一下!
大林1314 2010-08-05
  • 打赏
  • 举报
回复
学习了不少知识,
chenjin0624 2010-07-23
  • 打赏
  • 举报
回复
很感谢这么详细!
cxzgb123 2010-07-12
  • 打赏
  • 举报
回复
2楼讲的很彻底,现在我看来还是受益匪浅..顶!
shelleyeric 2010-06-14
  • 打赏
  • 举报
回复
二楼和三楼的回复怎么看不了???
shamohuangyuan 2010-06-12
  • 打赏
  • 举报
回复
受益匪浅!应该顶!
Bestrem_9 2010-05-18
  • 打赏
  • 举报
回复
不错,我们需要你们。。。
lichaojl 2010-05-17
  • 打赏
  • 举报
回复
顶 一下,厉害
ycc892009 2010-05-07
  • 打赏
  • 举报
回复
我试了在OnEraseBkGround函数里重绘或者在onpaint中重绘并重载onEraseBkGround返回true效果都是一样的,好像都没有很么区别的。并且还视乎前者刷新的速度还慢一点也。不过程序确实是先运行到onEraseBKGround函数先的。呵呵
coyer 2009-12-08
  • 打赏
  • 举报
回复
我也知道,不过楼上的几位写的太详细了,我写不了这么详细。
加载更多回复(36)

15,979

社区成员

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

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