全部博文(290)
分类: C/C++
2008-11-06 15:23:32
1:大多数应用程序在进入消息循环之前调用UpdateWindow来进行初始化,windows选择这个时机给相应的窗口过程发送第一条WM_PAINT消息;
引起消息的事件:
1:用户移动窗口时,先前被覆盖的窗口显示时;
2:用户调整窗口大小
3:使用ScrollWindow 或ScrollDC函数滚动窗口时
4:使用InvalidateRect or InvalidateRgn函数强制产生WM_PAINT消息
In some cases when part of the client area is temporarily written over, Windows attempts to save an area of the display and restore it later. This is not always successful. Windows may sometimes post a WM_PAINT message when:
在一些情况下,当客户区的一部分需要重写时,windows尝试着保存显示区域并在以后恢复它。但这并不是总能成功.windows可能在一些时候发送WM_PAINT消息,当:
下拉菜单弹出然后释放
In a few cases, Windows always saves the area of the display it overwrites and then restores it. This is the case whenever:
我们知道,windows为每一个窗口在windows内部维护一个paint 的结构体,这个结构用来标示一个无效区域,它代表窗口上被覆盖或者是无效的那一部分,这个区域的存在,是windows放置一个WM_PAINT消息在应用程序消息队列中的原因;当重绘窗口时,仅需重绘这一部分就可以;
我们可以调用InvalidateRect函数来让客户区中的一个矩形无效,如果此时消息队列中WM_PAINT消息已经存在,那么windows会重新计算无效区域的大小;窗口过程接受到WM_PAINT消息的时候它就能获取无效区域的坐标,当然,我们也可以调用GetUpdateRect函数来在任何时候获取无效区域坐标;
在窗口过程WM_PAINT消息分支中处理了BeginPaint 函数之后,整个窗口客户区都变为有效;程序也能调用ValidateRect函数来让客户区中的任何矩形区域有效,但用这个函数标示了整个客户区时,那么任何当前在应用程序队列中的WM_PAINT消息被移去;