首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

老师们,请问一下多次擦出背景的原因

2013-03-26 
老师们,请教一下多次擦出背景的原因。老师们,在问这些问题之前,其实看了不少资料,可能这些东西都是微软不开

老师们,请教一下多次擦出背景的原因。
老师们,在问这些问题之前,其实看了不少资料,可能这些东西都是微软不开源的,问一些朋友,

他们也不是很清楚。




1. wm_erasebkgnd这个消息很多时候在wm_paint之前。

也就是说,很多时候,先依赖defwindowproc这个函数擦出背景(假设程序员没有重写wm_erasebkgnd)

,然后进入wm_paint.

此时用beginpaint------------endpaint这组函数。

这组函数2个功能:

(1)区域有效;(2)擦出背景

亮点:(2)擦出背景。 如果区域有效了,那么defwindorproc就不会擦出背景。除非无效,defwindproc?



问题:这难道是多次擦出背景嘛?




2.  手工invalidaterect(NULL,NULL,TRUE); 这个函数会投递一个 wm_paint. 注意最后一个参数,是会导致

wm_erasebkgnd产生的。会擦出背景。

这里的擦出背景,是wm_paint擦出 的,还是wm_erasebkgnd擦出的?

有时候wm_erasebkgnd会在wm_paint之后产生。




[解决办法]
1.先是:wm_paint
2.然后wm_paint中的beginpaint 调 erasebkgnd



[解决办法]
本帖最后由 VisualEleven 于 2012-12-09 21:02:37 编辑 当WM_PAINT由InvalidateRect产生时,先发送WM_PAINT消息(异步),如果InvalidateRect的bErase为TRUE,BeginPaint检查到更新区域需要删除背景,向窗口发送一个WM_ERASEBKGND消息,如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRUE,如果处理WM_ERASEBKGND时返回TRUE,BeginPaint标记pt.fErase为FALSE.
在窗口重绘时,对于是先发WM_PAINT还是先发WM_ERASEBKGND消息,两者都有可能。
1.由于移动窗口,改变窗口,最大最小化窗口,导致的重绘。系统会先发WM_ERASEBKGND消息,后发WM_PAINT消息(此时OnPaint函数的wparam是一个hdc)。
2.由于调用了Invalidate()或InvalidateRect()导致的重绘。系统会发WM_PAINT消息。在处理WM_PAINT消息,通常会调用BeginPaint()(此时wparam是NULL)获得HDC。BeginPaint()会根据需要,决定是否发送WM_ERASEBKGND。

热点排行