WM_PAINT消息解析

  • WM_PAINT消息的产生:当显示区域(客户区)存在无效区域时,系统会产生一个WM_PAINT消息,通知视窗处理程序重绘显示区域。WM_PAINT消息不进入GetMessage(...)的消息队列,UpdateWindow(...)也不会产生WM_PAINT消息,只是通知系统优先处理WM_PAINT消息。
  • WM_PAINT消息产生的实例:窗口移动或显示,窗口大小改变,ScrollWindow或ScrollDC滚动显示区域的一部分,系统擦除覆盖了部分视窗的对话模块或消息模块,功能表下拉出来然后被释放,显示工具提示信息 ,用户使用InvalidateRect或InvalidateRgn使用显示区域无效。
  • 无效矩形:系统会为每个视窗保存一个“绘图资讯结构”,这个结构包含了无效区域的最小矩形的座标及其他资讯。由于WM_PAINT消息的优先级很低,在WndPro(...)处理WM_PAINT消息之前 ,显示区域有另外一部分变成无效区域时,系统就会重新计算重新包含两个无效区域的最小矩形,即新的无效矩形,如果消息队列中存在WM_PAINT时,将不会产生的WM_PAINT消息。在WndPro(...)处理WM_PAINT消息时,可以获取无效矩形的座标GetUpdateRect();
  • WM_PAINT消息解析
  • 有效矩形:在WndProc(...)处理WM_PAINT时,BeginPaint之后,整个显示区域有效。用户直接使用ValidateRect强行使显示区域的任意矩形有效,如果显示区域存在无效矩形且产生的WM_PAINT消息还没有被处理,而用户使用ValidateRect使用无效矩形区域有效时,这时系统会删除消息队列里的WM_PAINT消息。