当前位置: 首页 > article >正文

invalidateRect解析

先看函数结构:

BOOL InvalidateRect(
HWND hWnd, // handle of window with changed update region
CONST RECT *lpRect, // address of rectangle coordinates
BOOL bErase // erase-background flag
);
参数说明:

1:hwnd:要更新的客户区所在的窗体的句柄。如果为NULL,则系统将在函数返回前重新绘制所有的窗口, 然后发送WM_ERASEBKGNDWM_NCPAINT 给窗口过程处理函数。

2:lpRect:无效区域的矩形代表,它是一个结构体指针,存放着矩形的大小。如果为NULL,全部的窗口客户区域将被增加到更新区域中。

3:bErase:参数bErase为TRUE表示系统会在你画之前用背景色将所选区域覆盖一次,默认背景色为白色,可以通过设置BRUSH来改变背景色;如果为FALE则保存现在的背景色,我认为这并不是说不对背景重绘,而是说用原来的背景色来重新绘背景,所以即便你调用了SetBkColor()也不会改变它的背景色,除非,你将此参数设为TRUE;

返回值:
函数成功则返回非零值,否则返回零值。
说明:

该函数的作用是让指定的RECT区域变为无效,并在系统的消息队列中放置WM_PAINT消息,但由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。所以在调用invalidateRect()后并不会立即重绘,只能等到系统处理到它的或别人发的WM_PAINT消息时,才会被重绘;

如果想要立即重绘,调用UpdateWindow();

调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。其实发送的都是WM_PAINT消息,只不过是一个用的sendMessage()发的,一个是用PostMessage()发的。

对于WM_PAINT消息,我理解的处理过程如下:

在处理到WM_PAINT消息时,系统会将消息队列中所有的无效区域累加起来,一起重绘,然后丢弃所有的WM_PAINT消息。所以无论你发的WM_PAINT早还是晚,如果在处理到一个WM_PAINT消息时,它们都在队列中,就会将它们的无效区域累加起来,一起绘图。很明显,提高了效率!


http://www.lryc.cn/news/2416507.html

相关文章:

  • 【域名购买到备案及公安备案,全流程解析】
  • (五十一)时间序列分析二:平稳时间序列分析(ARMA)
  • 6to4隧道和6in4隧道的区别
  • 高分一号影像处理流程
  • postgresql 设置执行命令超时时间
  • nginx + lua环境配置
  • 【Excel系列9】-- 28个基础图表
  • 在JavaEye晃了一个来月真的感慨。
  • 从零开始搭建 reviewboard 环境(四) -- reviewboard 的安装过程中的问题解决
  • IP欺骗
  • 使用NE555制作多谐振荡器
  • MFC的坐标转换GetClientRect/GetWindowRect/ClientToScreen/GetCursorPos/ScreenToClient
  • Collections.synchronizedMap()与ConcurrentHashMap的区别
  • C++中critical section的使用
  • 高等数学学习笔记——第九十九讲——一阶线性微分方程组
  • 初学C语言以及C语言的常见概念
  • Sublime text 3最新注册码
  • Windows Installer Clean Up 软件正常卸载不了时,请它帮忙!
  • cocostudio使用基本要点汇总
  • AIS(自动识别系统)介绍
  • 【.NET】.NET 框架概述
  • fastDB个人使用心得
  • 进化算法——多目标优化
  • MNE溯源fieldtrip官网教程
  • JDK1.6安装详解、环境变量设置、测试安装及注意事项
  • leetcode Surrounded Regions 详解
  • java正则Matcher.matches()、Matcher.lookingAt()、Matcher.find()、 group()详解
  • 【实践】java.lang.Integer源码分析
  • CImage 从内存中读取图像
  • FileZilla Server简介及使用说明