您当前的位置:首页 > 美文摘抄 > 内容

invalidaterect(InvalidateRect(▭); 的用法)

本文目录

  • InvalidateRect(▭); 的用法
  • MFC中的InvalidateRect问题
  • InvalidateRect (hwnd, NULL, TRUE)的一些问题
  • InvalidateRect(hWnd, NULL, FALSE);
  • InvalidateRect()的最后一个参数是表示擦除背景,还是只是在PAINTSTRUCT中留下标记
  • InvalidateRect( CRect *)
  • 关于invalidaterect的问题
  • invalidaterect函数到底如何使用

InvalidateRect(▭); 的用法

你看看InvalidateRect的声明就知道了,其实它是两个参数,第一个是区域,第二个是要不要擦除背景。默认是TRUE。 如果屏幕闪烁厉害的话,你要映射WM_ERASEBKGND消息,返回TRUE,

MFC中的InvalidateRect问题

第二个参数是指示使矩形区域无效时,是否擦除矩形区域的背景的,TRUE的话就擦除背景,FALSE就不擦除,InvalidateRect(NULL,TRUE)表示擦除整个窗口的背景,InvalidateRect(NULL,FALSE)则不是。MSDN上是这么说的:CWnd::InvalidateRectvoid InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );The bErase parameter specifies whether the background within the update area is to be erased when the update region is processed. If bErase is TRUE, the background is erased when the BeginPaint member function is called; if bErase is FALSE, the background remains unchanged. If bErase is TRUE for any part of the update region, the background in the entire region is erased, not just in the given part. Windows sends a WM_PAINT message whenever the CWnd update region is not empty and there are no other messages in the application queue for that window.

InvalidateRect (hwnd, NULL, TRUE)的一些问题

InvalidateRect 会让操作系统自动发送 WM_PAINT消息!!!然后你就可以在 WM_PAINT消息的响应代码里绘图了,否则绘图代码无用,除非窗口被遮住了,不会调用的!!!操作系统有可能合并某些重绘操作,然后再发送WM_PAINT消息!!!InvalidateRect告诉操作系统,这个窗口失效了,需要重绘!操作系统会在发送WM_PAINT时,考虑这个问题,以便及时重绘窗口!!

InvalidateRect(hWnd, NULL, FALSE);

Windows API的InvalidateRect(m_hWnd, lpRect, bErase),会向Windows添加一个无效区域,并发送一个WM_PAINT消息要求系统重绘这个无效区域rect,在OnPaint中,系统响应WM_PAINT消息,OnPaint将调用CPaintDC dc(this)以得到绘图设备上下文,CPaintDC::CPaintDC(CWnd* pWnd)是CPaint的构造函数,从其中可以看到系统将调用CDC* ::BeginPaint(m_hWnd = pWnd-》m_hWnd, &m_ps),其中m_ps是一个LPPAINTSTRUCT结构,它包含有一个rcPaint成员,它代表当前的剪取区域,也就是当前的无效区域,这里它等于InvalidateRect(▭,TRUE)传入的rect矩形区域,此时我们便可以且只能在这个矩形区域内绘图,也就是说如果我们此时绘制的图形超过了这个矩形区域,程序将自动截断超出部分,只在该区域内绘图,可以在InvalidateRect后,或在OnPaint中使用CRect brect;GetUpdateRect(&brect)得到这个裁剪区域。也可以通过在OnPaint中得到dc后使用CRect mrect=dc.m_ps.rcPaint得到这个裁剪区域。如果没有显式的声明CPaintDC dc(this),系统将自己生成一个绘图设备上下文,此时也可以使用GetUpdateRect得到裁剪区域,但此时系统没有将我们需要的rect传递给rcPaint,所以此时得到的区域将是整个客户区,所以当在OnPaint中没有CPaintDC dc(this)时,程序将强制重画整个客户区,当有了CPaintDC dc(this)时,由于显式调用了带参数的构造函数,rect将传递给dc,此时强制绘图的区域将是rect。至于InvalidateRect(▭,TRUE)的第二个参数代表是否用背景重画,就是是否用背景颜色画刷填充剪取的无效区域rect,true代表用背景重画,flase代表不用背景重画。所以只要在OnPaint中显式地构造了一个CPaintDC设备上下文,程序就将得知当前的裁剪区域是rect,而如没有显示构造,系统将按默认的绘图方式绘制,此时裁剪区域是整个区域。2,由此可见,如果想让InvalidateRect发生效果,应该在OnPaint函数中利用CPaintDC dc(this)声明的dc绘图,因为只有这个dc含有无效区域的信息。如果在OnPaint中另外声明的了一个dc(someDCelse),这个dc不是本窗口dc,理论上不会发生作用。但是如果由于InvalidateRect的调用引起本窗口重绘,也会引发OnPaint函数,这时用关联其他设备的dc绘图,会原封执行,从而给人一种被执行了的错觉。

InvalidateRect()的最后一个参数是表示擦除背景,还是只是在PAINTSTRUCT中留下标记

CWnd::InvalidateRectvoid InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );参数: lpRect 指向一个CRect对象或RECT结构,其中包含了要被加入更新区域的矩形(客户区坐标)。如果lpRect为NULL,则整个客户区都被加入更新区域。 bErase 指定更新区域内的背景是否要被擦除。 说明:这个函数将给定的客户区矩形加入CWnd更新区域,使该区域无效。无效的矩形与更新区域内的其它区域一起被标记为在发送下一条WM_PAINT消息时需要重画。无效的区域在更新区域内累积,直到发生下一次WM_PAINT调用,这个区域被处理为止,或者直到这个区域被ValidateRect或ValidateRgn成员函数标为有效为止。bErase参数指定了在处理更新区域的时候是否要擦除更新区域内的背景。如果bErase为TRUE,则当调用BeginPaint函数的时候,将擦除背景。如果bErase为FALSE,则背景保持不变。如果对于更新区域的任何部分bErase为TRUE,则整个区域的背景都会被擦除,而不仅是给定的部分。当CWnd的更新区域不为空,并且应用程序的窗口消息队列中没有其它消息时,Windows就发送一条WM_PAINT消息。

InvalidateRect( CRect *)

InvalidateRect(&Rect)和Invalidate()两个函数形式和功能差不多,但Invalidate是使得整个窗口无效,形成无效矩形,而InvalidateRect(&Rect)是使得指定的区域无效。如果你的OnPaint比较简单时,InvalidateRect(&Rect)和Invalidate()区别不是很大,因为相对重绘量少,所以整个重绘和局部重绘区别不是很明显。当你界面比较复杂时,重绘全部和重绘局部的量就比较明显,InvalidateRect(&Rect)明显效率高于Invalidate()。但是InvalidateRect(&Rect)需要你自己判断哪些区域是无效,而Invalidate()不需要(因为它是全部重绘)。所以当全部重绘的计算量高于判断局部无效的计算量时,更适合使用InvalidateRect(&Rect)。 多个WM_PAINT消息之间通过InvalidateRect使之失效的区域就会被累加起来,然后在一个WM_PAINT消息中一次得到更新,不仅能避免多次重复地更新同一区域,也优化了应用的更新操作。像这种通过InvalidateRect和InvalidateRgn来使窗口区域无效,依赖于系统在合适的时机发送WM_PAINT消息的机 制实际上是一种异步工作方式,也就是说,在无效化窗口区域和发送WM_PAINT消息之间是有延迟的。

关于invalidaterect的问题

先回答你的第二个问题。scrollWindow并不产生WM_PAINT消息。程序第一次收到WM_PAINT消息是在你的WinMain函数里,第一次调用UpdateWindow的时候产生的。接下来,当你的窗口被最小化,或者由于种种原因被遮盖,或者你调用了InvalidateRect这样的函数之后才产生WM_PAINT消息。具体来说,当你的窗口被遮盖了,这可能是因为你去玩了全屏的3D游戏,把整个桌面都遮盖了,或者是你拿别的窗口把程序的窗口遮盖了等等。Windows操作系统记录你的窗口的那一部分被遮盖了,叫做“无效部分”。这时候就会产生WM_PAINT消息,WM_PAINT消息的响应代码应当重绘窗口,并通过BeginPaint()和EndPaint()的调用使整个无效部分恢复为有效。现在回答你的第一个问题。InvalidateRect的作用就是产生WM_PAINT消息。WM_COMMAND里面的ValidateRect的作用在于,正常来说,我们在WM_PAINT里面会有BeginPaint()和EndPaint()的调用,这会使得窗口有效。但是有时候,我们的绘制不是通过BeginPaint()和EndPaint()产生的,这个时候我们却已经绘制了窗口了。这时候可以通过ValidateRect来使窗口有效。(这时候就不能用BeginPaint()和EndPaint()来使窗口有效了,因为这一对函数只能在处理WM_PAINT消息的时候进行调用。 rect的大小是在WM_SIZE里面确定的。窗口第一次绘制出来的时候会产生一次WM_SIZE消息。此后每次改变窗口时都会产生这个消息。因此在第一次收到WM_COMMAND消息之前,rect结构体的值就已经在第一次WM_SIZE消息时设置好了。

invalidaterect函数到底如何使用

该函数向指定的窗体更新区域添加一个矩形,然后窗口客户区域的这一部分将被重新绘制。BOOL InvalidateRect(HWND hWnd, // handle of window with changed update regionCONST RECT *lpRect, // address of rectangle coordinatesBOOL bErase // erase-background flag);参数:hWnd:要更新的客户区所在的窗体的句柄。如果为NULL,则系统将在函数返回前重新绘制所有的窗口, 然后发送WM_ERASEBKGND 和 WM_PAINT 给窗口过程处理函数。lpRect:无效区域的矩形代表,它是一个结构体指针,存放着矩形的大小。如果为NULL,全部的窗口客户区域将被增加到更新区域中。bErase:指出无效矩形被标记为有效后,是否重画该区域,重画时用预先定义好的画刷。当指定TRUE时需要重画。返回值:函数成功则返回非零值,否则返回零值。说明:被标记为无效矩形的区域直到WM_PAINT消息被处理完之后才会消失,或者使用ValidateRect(),ValidateRgn()函数来使之有效。当应用程序的消息队列中为空时,并且窗体要更新的区域非空时,系统会发送一个WM_PAINT消息到窗体。这两个都用于声明客户区无效,当下一个WM_PAINT消息到来时发生重画。其中InvalidateRect(hwnd, NULL, true);重画时将擦除背景。InvalidateRect(hwnd, NULL, false);重画时不擦除背景需要:Windows NT/2000/XP/Vista: 包含Windows NT 3.1以及之后版本。Windows 95/98/Me: 包含Windows 95 以及之后版本。Header: 声明在 Winuser.h中; 包含在Windows.h中。Library: Use User32.lib.


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 无法删除文件,怎么回事?文件夹删不掉怎么办啊

下一篇: 离家出走怎么生存下去(离家出走怎么生存)



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号