书上说到“要在处理WM_PAINT消息时在更新的矩形外绘图,您可以在调用BEGINPAINT
之前使用 INVALIDATERECT(HWND,NULL,TRUE);它使整个客户区变的无效,并檫除背景。但是,如果最后一个参数等于FALSE,则不檫除背景,原有的东西将保留原处。通常这是WINDOWS程序在无论何时收到WM_PAINT消息而不考虑REPAINT结构的情况下简单的重画整个客户区最简单的办法。例如,如果在客户区的显示输出包括了一个圆,但是只有圆的一部分落到了无效的矩形区中,它就使仅绘制的圆的无效部分变的没有意义。这需要画整个圆。在你使用从BEGINPAINT返回的设备描述表句柄时,WINDOWS不会绘制RCPAINT矩形外的任何部分!
  在第二章的HELLOWIN中,我们并不关系处理WM_PAINT消息时的无效矩形。如果文本显示区域恰巧在无效的矩形内,则由DRAWTEXT恢复之,不过,这一决定需要时间。……”
我把书的原句打出来了,这几段话,让我搞糊涂了,到底无效矩形区是能画图画还是不能画,有效矩形区呢?还有BEGINPAINT是让整个客户区有效是吗?还有“如果文本显示区域恰巧在无效的矩形内,则由DRAWTEXT恢复之”这是什么意思呢?“INVALIDATERECT(HWND,NULL,TRUE);”函数是使正个客户区无效,那怎么又说
“要在处理WM_PAINT消息时在更新的矩形外绘图,您可以在调用BEGINPAINT
之前使用 INVALIDATERECT(HWND,NULL,TRUE);”
总之这段怎么理解 还请请各位高手指教! 小弟另送分 谢谢了

解决方案 »

  1.   

    关键在于无效区与有效区都能画,只是看你需要而已!INVALIDATERECT可能是系统掉的,也可能是你自己想标识一下
    无效区,然后同一重画。不用死抠他的字眼,外国人的表达方式和翻译都会浪费你的时间。
      

  2.   

    只有当区域变得无效,才会发出WM_PAINT消息进行重画工作。
    有效区域是要进行画的话,必须自己画。INVALIDATERECT(HWND,NULL,TRUE);就是使整个区域都无效,从而发出WM_PAINT消息,当然进行重画的工作由你自己在OnPaint或者OnDraw函数中做。
      

  3.   

    为什么,有了动态的,在类的头部的implement 有这么什么动态的声名呀,还有一些不懂的好多宏的声名,我不懂该怎么办呀,
      

  4.   

    呵呵,前几天我也在看这个地方,我是这么理解的,如果区域无效了,系统就会发出PAINT消息,在winmain里面  ShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ;就是让区域无效了,然后窗口程序就会处理PAINT消息,BeginPaint (hwnd, &ps)就是让区域变为有效,这时画的东西应该才能显示在上面, 
    至于这一段“要在处理WM_PAINT消息时在更新的矩形外绘图,您可以在调用BEGINPAINT
    之前使用 INVALIDATERECT(HWND,NULL,TRUE);”,那是因为可能无效矩形并不是整个窗口,用INVALIDATERECT(HWND,NULL,TRUE)就可以将整个客户区与更新矩形合并,就可以在整个客户区画图了
      

  5.   

    在MSDN里面这个东西讲得很多,可惜是英文的,不太方便,
      

  6.   

    各位大哥broccoli(磁场) 说的对吗?
      

  7.   

    因为无效区的出现,windows发送一个WM_PAINT消息给消息队列
      在消息处理函数处理WM_PAINT的时候,调用BeginPaint(hwnd,&ps)
       你也看到了,这个ps中包含了无效区的信息,说穿了,ps知道无效区就是什么样的一个区域,你绘图的话,无论你怎么画,只能在无效区画,就是说,别的地方画了也不出来,没用的,只能在无效区域把你画的东东显示出来。
      另外,调用BeginPaint确实会使无效区变的有效,这很正常啊,你想,你都在消息函数中处理了WM_PAINT消息,那这个无效区域还要来干什么呢。你看到书上说了吗,不让无效区有效的话,就会一直发送WM_PAINT消息的!
      最后,INVALIDATERECT(HWND,NULL,TRUE)使整个客户区无效的话。
      

  8.   

    另外,调用BeginPaint确实会使无效区变的有效,这很正常啊,你想,你都在消息函数中处理了WM_PAINT消息,那这个无效区域还要来干什么呢。你看到书上说了吗,不让无效区变为有效的话,就会一直发送WM_PAINT消息的!
      我不是说了吗??
      

  9.   

    据我的理解,如果你的窗口客户区被一个别的窗口挡住了,那么这块区域就无效了,就会发送PAINT消息,你需要在处理PAINT消息将它重画,并且画的函数只对这个无效区有效,对别的没有被挡住的地方不起作用,没有被挡住的地方就是有效区,它不会被PAINT消息处理,你需要使用GETDC获得句柄来画,比方说在WM_MOUSEDOWN里面,你执行GETDC后就可以画了
      

  10.   

    其实这个问题很简单,上个星期我对无效矩形的问题也不懂,看了看MSDN就明白了,你把SDK里面InvalidateRect,BeginPaint等函数的解释好好看看,应该就可以明白了
      

  11.   

    上面已经说得很清楚了,不是说不能在有效区域内画,而是有效区域内WINDOWS自己不会画,这是为了节省时间,如果要画你就要把整个客户区变得无效,然后WINDOWS只好自己全部重画了,,,