见过画直线擦除以前留下的路径,但是画圆时留下的是一片阴影,如何解决这个问题。我用的程序是基于对话框的,用Invalidate()可以实现吗?而且另有个问题,当对话框拖动或者最小化后,以前画的就全没了,这又怎么解决?

解决方案 »

  1.   

    如果画图算法不是很复杂,把全部的画图代码都放在OnPaint里面完成,画前先清背景
      

  2.   

    用invalidate可以的.以前画的没有了那是因为没有保存下来.
      

  3.   

    在OnPaint里不行的,因为我要求能看到画圆的过程,所以必须在MouseMove里完成。
    用Invalidate有个问题,就是当画完一个圆,再画一个圆时,会把原来的那个也擦掉。如何解决。
      

  4.   

    要保存原来的那个圆的数据,在OnPaint()里必须把所有的圆在绘制一遍。
    数据可以保存在Document里。
      

  5.   

    接着骗分:
    if(!(m_HLine||m_VLine||m_HVLine||m_BendLine||m_Rectangle||m_Circle1))return;
    if(!m_FirstClick) return;
    CPoint ScrollPoint;
    ScrollPoint=GetScrollPosition();
    //point.x+=ScrollPoint.x;
    //point.y+=ScrollPoint.y;
    CDC * pdc;
    pdc=GetDC();
        CPen pen,*OldPen;
        pen.CreatePen(PenStyle,PenWidth,m_PenColor); //PS_SOLID   
        OldPen=pdc->SelectObject(&pen);
    if(!m_BendLine)
    SetCursor(LoadCursor(NULL,IDC_CROSS));
    m_OldDrawMode=pdc->SetROP2(R2_NOTXORPEN);//重画时可以擦除原来的画线
    m_End=point;

    //画斜线
    if(m_HVLine)
    {
    //擦去上次的画
    pdc->MoveTo(m_Begin.x ,m_Begin.y );
    pdc->LineTo(m_OldEnd.x ,m_OldEnd.y );
    //重新绘画
    pdc->MoveTo(m_Begin.x ,m_Begin.y );
    pdc->LineTo(m_End.x ,m_End.y );       
    }
    //画水平线
    if(m_HLine)
    {
    //擦去上次的画
    pdc->MoveTo(m_Begin.x ,m_Begin.y );
    pdc->LineTo(m_OldEnd.x ,m_Begin.y );
    //重新绘画
    pdc->MoveTo(m_Begin.x ,m_Begin.y );
    pdc->LineTo(m_End.x ,m_Begin.y );  
    }
    //画竖直线
    if(m_VLine)
    {
    //擦去上次的画
    pdc->MoveTo(m_Begin.x ,m_Begin.y );
    pdc->LineTo(m_Begin.x ,m_OldEnd.y );
    //重新绘画
    pdc->MoveTo(m_Begin.x ,m_Begin.y );
    pdc->LineTo(m_Begin.x ,m_End.y );   
    }
    //画矩形
    if(m_Rectangle)
    {
    //擦去上次的画
    pdc->Rectangle(CRect(m_Begin,m_OldEnd));
    //重新绘画
    pdc->Rectangle(CRect(m_Begin,m_End));
    }
    m_OldEnd=m_End;
    pdc->SelectObject(OldPen);
    ReleaseDC(pdc);
    pen.DeleteObject();
    CPoint m_Begin在LBUTTONDOWN中第一次单击时取得。
    最后一次重画要在lBUTTONDOWN中画要不填充则设置OldBrush=(CBrush*)pdc->SelectStockObject(NULL_BRUSH);//创建一个不填充的画刷,否则选一个别的。
      

  6.   

    获取矩形区域。使用划刷填充不行吗?呵呵。思路简单的很 !!!!另外,使用  updatedata(true) 和  (false)