1.是否可以利用两个无效区域的坐标(left,top,right,bottom)来进行判断,然后做出相应的选择.
2.如果使用Win32SDK,可以调用GetDC().
   hdc = GetDC(hwnd);
   [others programs lines]
   ReleaseDC(hwnd, hdc);
VC吗,由于我也是才学,哪有说错之处.......
      
                           magicwizard
                           [email protected]

解决方案 »

  1.   

    分别针对两个矩形区使用两个BOOL变量,并将初始值设置成FALSE,以后根据需要将其中一个设置成TRUE,根据这两个变量的值来控制重画。
    如下所示:
    //m_bDrawRec1,m_bDrawRec2为两个BOOL型成员变量,初始值为FALSE(可在OnInitialUpdate()中设定)
    CMyView::OnLButton()
    {  ......
      m_bDrawRec1=TRUE;
      InvalidateRect(&myRect1,TRUE);
      .......
      m_bDrawRec2=TRUE;
      InvalidateRect(&myRect2,TRUE);
    }CMyView::OnDraw()
    {
      if(m_bDrawRec1)
        DoDrawRect();
      if(m_bDrawRec2)
        DoDrawRec2()
      m_bDrawRec1=m_bDrawRec2=FALSE; //恢复原始值
    }
      

  2.   

    这样的方法可能行,有没有更直接的办法呢?比方说GetClipBox()有没有用呢?而且,请问对于无效区之外的画图,OnDraw()是怎么处理的?
      

  3.   


        在CMyView::OnDraw()中什么也不用做,只管把该显示的东西全部画出来就行了。
    因为当使用InvalidateRect或InvalidateRgn指定了无效区时,OnDraw会自动更新无效区的内容,而在无效区外的内容OnDraw不会把它们更新。
        如果你在OnDraw中加入判断无效区,然后有选择地显示内容,这样做会使显示不正常,因为当系统需要刷新CMyView时(用户更改了窗口尺寸、窗体被别的窗体遮盖后恢复时),自动调用OnDraw函数,而这时OnDraw却有选择地显示出部分内容,其它内容就不见了。
        其实这是个很简单的问题,写段简单的代码做个试验就可以了。
      

  4.   

    感谢dzl,Davis_dai;正如dai兄所言:
    CMyView::OnDraw()
    {
      if(m_bDrawRec1)
        DoDrawRect();
      if(m_bDrawRec2)
        DoDrawRec2()
      m_bDrawRec1=m_bDrawRec2=FALSE; //恢复原始值
    }结果正确,可是最小化窗口,然后最大化后,画面就多了几根大斜线,请问这是怎么回事?
      

  5.   

    windows will do it.
    you have no need to find out which rect should be
    redraw by yourself.
    you just need write a completely redraw code.
    jansen zhu
      

  6.   

    1.这个思路不太好,实现叫困难。建议用davis_dai的方法,但是否使用“m_bDrawRec1=m_bDrawRec2=FALSE; //恢复原始值”可根据你的需要而定。
    2.ondraw()只处理无效区以内的重画,具体细节可参看MFC源码。