下面是一个鼠标移动消息函数(省写):void CMyView::OnMouseMove(UINT nFlags, CPoint point) 
{
InvalidateRect(rectOld, TRUE); //第一次
InvalidateRect(rectNew, FALSE); //第二次 }我知道InvalidateRect()函数将触发OnPaint()函数,然后触发OnDraw(),想象应该是每次鼠标的移动都会触发两次OnDraw(),但是为什么我单步调试只见触发一次,用TRACE()跟踪也只见触发一次,是在OnMouseMove()结束时才触发。我不明白这是为什么,按理讲应该是在第一次执行InvalidateRect()之后就立即调用OnDraw(),不知道到底是触发了OnDraw()函数几次,有谁能够帮我解释一下它们(InvalidateRect,OnPaint,OnDraw)的关系。
得到答案之后立即结帐。谢谢先!(问题是不是太简单了!不好意思,我是VC采鸟)

解决方案 »

  1.   

    InvalidateRect(...)声明客户区无效,需要等到有WM_PAINT消息到来才触发了OnDraw()或OnPaint()重画,然而,默认情况下,在消息队列中没有其它消息时,WINDOWS才发送WM_PAINT消息。所以你的代码只在OnMouseMove结束时有一次OnDraw();下面这样才能调用OnDraw();两次。void CMyView::OnMouseMove(UINT nFlags, CPoint point) 
    {
         InvalidateRect(rectOld, TRUE); //第一次
        
         UpdateWindow();//强制在此时发送WM_PAINT消息     InvalidateRect(rectNew, FALSE); //第二次 }
      

  2.   

    原来是这样,非常感谢hnyyy.
    想在问一下这种无效区域是哪种意义上的无效???
      

  3.   

    简单点说,所谓无效区域就是当WM_PAINT消息到来时需要重画的区域。需要重画,当然就是无效了?
      

  4.   

    其实还有一个裁减GetClipRect()的概念!