inner的使用

知识点-Static关键字理解

  返回  

Invalidaterect()函数的作用详细解释

2021/8/20 14:02:05 浏览:

函数原型:
BOOLInvalidateRect(

HWND hWnd, // handle of window withchanged update region 窗口句柄。

CONST RECT *lpRect, // address ofrectangle coordinates rect结构体的指针。

BOOL bErase // erase-background flag 是否要发送WM_ERASEBKGND消息从而擦除原来的背景

);

这个函数的作用是,使得Client的一个矩形区域变得无效,rect结构体可以自己编辑,也可以使用GetClientRcet()来填充(这里的矩形大小Client的大小),最主要的是第三个参数,第三个参数决定了是否发送WM_ERASEBKGND消息,从而决定了是否擦除Client原有的图形。当然InvalidateRect发送WM_PAINT的形式是一种POST形式(即发送到程序消息队列),而不是像SendMessage一样直接让操作系统带着消息,调用WndProc。

当然如果想像SendMessage一样的。可以在后面接着使用UpdateWindow()直接绕过程序消息队列直接发送消息到WndProc函数,来重绘窗口。

分析一下下面的程序会更加的清晰:


   
  1. case WM_RBUTTONDOWN:
  2. hdc = GetDC(hwnd);
  3. GetClientRect(hwnd, &rect);
  4. DrawText(hdc, TEXT( "右键键被单机咯!"), 13, &rect, DT_VCENTER | DT_SINGLELINE);
  5. ReleaseDC(hwnd, hdc);
  6. InvalidateRect(hwnd, NULL, true);
  7. //UpdateWindow(hwnd);
  8. Sleep( 1000);
  9. return 0;
  10. case WM_LBUTTONDOWN:
  11. hdc = GetDC(hwnd);
  12. GetClientRect(hwnd, &rect);
  13. DrawText(hdc, TEXT( "左键被单机咯!"), 13, &rect, DT_CENTER | DT_SINGLELINE);
  14. ReleaseDC(hwnd, hdc);
  15. return 0;


这里为了能看到效果我使用了Sleep。在实际编程处理消息,不是在多线程时,这样的使用是十分愚蠢的,因为,消息循环的机制,如果你不快速的处理每一条消息。用户的体验将会受到很大的影响。比如,,无法操作,,这是最尴尬的。

1,这里如果UpdateWindow(hwnd)被注释掉的情况下,单机左键后,客户区屏幕打印出左键被单机咯,单机右键后打印出右键被单机咯。随后,调用了InvalidateRect()发送了WM_PAINT和WM_ERASEBKGND消息到消息队列,因为Invalidate第三个参数是true所以背景被重画,并且使rect的矩形范围失效。从而延迟1000ms后,处理WM_PAINT消息后,窗口上的左键…右键…..的字样都被清除。

2,如果UpdateWindow(hwnd) 没被注释掉。左键单机,右键单机,出现两条提示后,立即都消失(一般情况看不到右键点击的提示,而是直接擦除左键点击的提示的效果),为什么呢,因为UpdateWindow的作用,直接绕过队列,带到WndProc中去。所以直接重绘了。

3.如果InvalidateRect里面是false则结果将是没有任何效果。难道真的是没有效果吗。当然不是,实际上是有效果的。因为,这里InvalidateRect还是使得rect的区域失效了,只是不会擦除背景也就是原来打印在屏幕上的提示都不会被清除。而且还是发送了WM_PAINT消息,所以WM_PINT消息内的处理,会执行一次。

4.第三种情况,不就是使得区域无效,而且发送了WM_PAINT消息吗。实际上,就算不发送WM_PAINT消息,系统也会派送WM_PAINT消息。因为无效了。我又想到UpdateWindow不也是给WndPro带来了WM_PAINT消息吗?窗口不会重绘吗?答案是不会。因为窗口没有无效的区域,所以WM_PAINT内部的代码也没有执行。(为什么没有执行,原因是UpdateWindow内部检测了是否有无效区域,如果没有则不发送消息)。

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号