windows——消息——WM_PAINT

来源:互联网 发布:手机有算量软件吗 编辑:程序博客网 时间:2024/06/08 06:39

WM_PAINT

WM_PAINT通知窗口消息处理程序,窗口的全部或部分显示区域需要绘制
windows发送WM_PAINT情况:
  • WinMain进入消息循环之前的初始化期间调用函数UpdateWindow
  • 使用者移动窗口或显示窗口时,窗口中先前被隐藏的区域重现可见
  • 使用者改变窗口大小(如果窗口类别样式有CS_HREDRAW和CS_VREDRAW位flag)
  • 程序使用ScrollWindow或ScrollDC函数滚动显示区域一部分
  • 程序使用InvalidateRect或InvalidateRgn函数可以产生WM_PAINT
在某些情况下,显示区域的一部分被临时覆盖,windows试图保存一个显示区域,并在以后恢复它,但这不一定能成功,windows可能发送WM_PAINT情况:
  • windows擦除覆盖了部分窗口的对话框或消息框
  • 菜单下拉出来,然后被释放
  • 显示工具提示消息
在某些情况下,windows总是保存它所覆盖的显示区域,然后恢复它,因此不会发送WM_PAINT,windows不会发送WM_PAINT情况:
  • 鼠标光标穿越显示区域
  • 图标拖过显示区域
注:显示区域是整个应用程序窗口中未被标题列、窗口边框,以及可选的菜单项、工具列、状态栏和滚动条占据的部分

无效区域

  • 窗口消息处理程序接收到WM_PAINT后,准备更新整个显示区域,但经常只需更新一个较小区域(最常见的是显示区域中的矩形区域),为了渲染性能,只绘制需重新绘制那部分,而不必重新绘制整个显示区域
  • 需重新绘制那部分区域称为无效区域或更新区域,显示区域内无效区域的存在,才会让windows将一个WM_PAINT放在消息队列中,只有在显示区域的某一部分失效时,窗口才会接受WM_PAINT
  • windows内部为每个窗口保存一个绘图信息结构,这个结构包含了包围无效区域的最小矩形坐标及其它信息,这个矩形叫做无效矩形,也称无效区域,如果在窗口消息处理程序处理WM_PAINT之前显示区域中另一个区域变为无效,windows计算出一个包围两个区域的新的无效区域(新的无效矩形),并更新绘图信息结构,windows不会将多个WM_PAINT都放在消息队列中,而是进行合并处理,也是为了渲染性能,即任何时刻,消息队列中每个窗口至多一个WM_PAINT消息
  • InvalidateRect可使显示区域内矩形无效,如果消息队列中已包含WM_PAINT,windows计算新的无效矩形,更新绘图信息结构,否则将一个新的WM_PAINT放入消息队列,GetUpdateRect可取得窗口无效矩形坐标
  • 调用BeginPaint之后,整个显示区域变有效(不再有无效区域存在),ValidateRect可使显示区域内的任何矩形区域变有效,如果当前不再有无效区域存在,当前消息队列中对应窗口WM_PAINT被删除(如果有)
原创粉丝点击