WM_PAINT与WM_ERASEBKGND

来源:互联网 发布:2016第二季度经济数据 编辑:程序博客网 时间:2024/05/17 20:13

http://blog.sina.com.cn/s/blog_5344089201009whk.html

WM_paint详解


http://blog.sina.com.cn 2007年02月15日17:43 7456wg标签:

WM_PAINT是Windows窗口系统中一条重要的消息,

 

 

 

http://blog.163.com/wangpf2008@126/blog/static/351551192007915784249/

WM_PAINT与WM_ERASEBKGND 

2007-10-15 19:08:42|  分类:IT相关 |  标签:|字号订阅

InvalidateRect和UpdateWindow的区别

InvalidateRect是将客户区标记为无效,并产生WM_PAINT消息,Windows会将WM_PAINT消息放入队列,等待窗口过程的处理,然后操作系统将WM_PAINT当作是低优先级消息,如果后面有其他的动作要处理,则可能会出现空白的区域需要等待一段时间才被刷新。

UpdateWindow则将导致操作系统立即用WM_PAINT调用窗口过程,而不进入队列,使窗口得到立即的刷新。窗口过程完成刷新后立即退出,Windows将控制返回给UpdateWindow之后的语句。

WM_PAINT与WM_ERASEBKGND     

     当WM_PAINT不是由InvalidateRect产生时,即由最大化,最小化等产生时,或者移动产生(移动有时只会产生WM_ERASEBKGND消息)系统先发送WM_ERASEBKGND消息,再发送WM_PAINT消息.

    如果处理WM_ERASEBKGND消息时返回FALSE,BeginPaint标记pt.fErase 为TRUE,如果处理WM_ERASEBKGND时返回TRUE,BeginPaint标记pt.fErase为FALSE.

    当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.

    如果pt.fErase标记为TRUE,指示应用程序应该处理背景,但是应用程序不一定需要处理,pt.fErase只是作为一个标记.

    补充:DefWindowProc(hWnd, message, wParam, lParam)处理WM_ERASEBKGND消息时默认用下面的画刷清除背景

wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

WM_ERASEBKGND返回TRUE和返回FALSE是一个规范,一般情况下没有什么区别,但是如果什么时候用到了,会根据函数返回值判断后续处理。因此最好按照要求返回数据

1:UpdateWindow只是发送一个WM_PAINT消息给窗口。如果你的窗口没有设置无效区域的话,UpdateWindow就没有作用。  

        2:InvalidateRec也只是把窗口中的某个区域设置成一个无效区域。这个区域要等到窗口下一次接收到WM_PAINT消息的时候才会被重画。    

        如果你想立即更新某一个窗口区域,可以依次调用InvalidateRect和UpdateWindow

 

原创粉丝点击