也不调用onDraw的,好像显卡记录了所有的线啊点的再去重画了,?实际的系统操作不知道是什么样的,有人解惑一下啊。

解决方案 »

  1.   

    这个函数的原理很简单吧,发一个WM_PAINT就行了,显卡是不可能记住所有信息的,它也记不住,画图工作还是在WM_PAINT消息中你自己画的,楼上说也不调用OnDraw,其实是调用了的.
      

  2.   

    应该是调用了,不过简洁调用而已。像楼上所说,先调用WM_PAINT,然后调用ONPAINT,ONPAINT中调用ONDRAW的
      

  3.   

    但是ondraw的函数实现实际上是对整个屏幕来进行控制重画的,假如invalidateRect调用了ondraw,系统怎么来裁剪代码??个人之见啊。
      

  4.   

    当然是通过hdc还剪裁的你可以这样试试
    在ondraw里面,用整个window的hdc来重画(getdc()),看看,剪裁区是不是就没有效果了?其实奥妙都在BeginPaint里面呢
      

  5.   

    严格来说,invalidateRect()会引发WM_PAINT,所以直接调用的是WM_PAINT的消息处理函数,对应MFC就是OnPaint(),这个函数根据结构PAINTSTRUCT来得到无效区来完成重画.OnDraw是MFC自己加上去的,它在OnPaint中被调用.
      

  6.   

    即使是在onpaint函数处理PAINTSTRUCT结构体中的RECT区域,但在ONPAINT函数中我们的代码肯定不是分N多个区域来画的,,因为RECT的大小未知,N值都不知道怎么分的,那么系统怎么在ONPAINT的整体代码中只让在RECT区域的代码才生效?难道是在内存中重画一次,然后把内存对应的RECT区域再反显出来??
      

  7.   

    InValidateRect()函数其实是自己实现的,因而要自己处理数据,让处在矩形框中的数据重画
      

  8.   

    先发一个WM_PAINT消息,WM_PAINT的消息响应函数里面调用BeginPaint就会返回一个已经裁减好了的HDC,你可以看看CPaintDC的源码。
      

  9.   

    好好看看MSDN
    The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs or until the region is validated by using the ValidateRect or ValidateRgn function. The system sends a WM_PAINT message to a window whenever its update region is not empty and there are no other messages in the application queue for that window. If the bErase parameter is TRUE for any part of the update region, the background is erased in the entire region, not just in the specified part.