各位大大,我刚接触vc不久,最近写一个简单地2D绘图程序,有一个弱弱的问题:
画一条线后,再画另外一条线时,两条线重叠的部分线都消失了,是我用的绘图设置不对吗?
我试了SetROP2中所有的参数,都是一样,哪位大侠指点一下,谢了。

解决方案 »

  1.   

    void CDLine::DrawStatic(CDC*pDC)
    {
     
     CPen m_pen;
     m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor);
     CPen* pen=(CPen*)pDC->SelectObject(&m_pen);
     int oldDrawingMode=pDC->SetROP2(m_DrawingMode);
     COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor);
     int OldBkMode=pDC->SetBkMode(m_BkMode); pDC->MoveTo(m_FirstPoint);
     pDC->LineTo(m_SecondPoint); pDC->SelectObject(pen);
     pDC->SetROP2(oldDrawingMode);
     pDC->SetBkMode(m_BkMode);
     pDC->SetBkColor(OldColor);
    }...void CUnit::Initial()
    {
      m_BkMode=TRANSPARENT;
      m_Rgn=NULL;
      m_FirstPoint=0;
      m_SecondPoint=0;
      m_PenColor=RGB(0,0,0);
      m_BrushColor=RGB(0,0,0);
      m_BackgroundColor=RGB(255,255,255);
      m_PenWidth=1;
      m_PenStyle=PS_SOLID;
      
      m_DrawingMode=R2_COPYPEN;
      //m_DrawingMode=16;
      m_HaveLBUp=false;
      m_HaveFindFirst=false;
      m_DrawStatus=Draw_Status;}
      

  2.   

    最近也正在写画图,直线的动态画法,最好不要用 SetROP2 (异或)去画,因为无论如何,异或,或者反(异或)都肯定要改变直线的颜色的。
    应该在鼠标按下时,用一个DC来保存先前的图像,在每次鼠标移动时覆盖视图DC(注意脏矩形优化),画直线要直接在Cview 的DC上画,不要在背景缓冲DC上画。在鼠标弹起时再保存到背景缓冲DC上。如果你非要用异或模式来画直线,如下:
    异或绘图方式花直线,的弊端在于,非白色背景时,线条的颜色是改变了的。(虽然最终的颜色不变)
    在OnMouseMove 中如下写:   CPen * pPen,pen;
       pen.CreatePen(PS_SOLID,1,pWnd->m_ClrBox.GetFrontClr());
       pPen = m_DCCanView.SelectObject(&pen); //m_DCCanView 是背景缓冲DC   //设置系统色彩模式取“反异或”色
       int oldRop = m_DCCanView.SetROP2(R2_NOTXORPEN); 
       // 画线
       m_DCCanView.MoveTo(m_PrePoint);
       m_DCCanView.LineTo(m_PrePoint2);
       //注意这里不能把系统模式设置回去,因为只有是“反抑或”模式才能被擦除。
       m_DCCanView.MoveTo(m_PrePoint);
       m_DCCanView.LineTo(point);
       m_PrePoint2 = point;
       this->Invalidate(FALSE);在OnMouseUp 中进行最后的擦除和画线,把DC的缺省模式设置回来。略。
      

  3.   

    在鼠标移动的时候我会调用这个方法
    我试过R2_NOTXORPEN,结果也是一样
    能告诉我怎么改吗void CDLine::DrawActive(CDC *pDC,CPoint point)
    {
     CPen m_pen;
     m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor);
     CPen* pen=(CPen*)pDC->SelectObject(&m_pen); COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor);
     int OldBkMode=pDC->SetBkMode(m_BkMode); pDC->MoveTo(m_FirstPoint);
     pDC->LineTo(m_SecondPoint);
     pDC->SelectObject(pen); pDC->SetBkMode(m_BkMode);
     pDC->SetBkColor(OldColor);
    }
      

  4.   

    void CDLine::DrawActive(CDC *pDC,CPoint point) 

    CPen m_pen; 
    m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor); 
    CPen* pen=(CPen*)pDC->SelectObject(&m_pen); 
     pDC->MoveTo(m_FirstPoint); 
    pDC->LineTo(m_SecondPoint); 
    pDC->SelectObject(pen); 
    m_pen.DeleteObject()
    }将代码改成这样试试效果!
      

  5.   

    不会是Initial函数没有调用吧?
      

  6.   

    void CDLine::DrawStatic(CDC*pDC) 

    void CUnit::Initial()
    都在哪调用的.
    贴上看看. 
      

  7.   

    你的这连个坐标是怎么得的?注意要3个点才能画出直线。
    第一点:m_PrePoint 在鼠标按下时储存
    第二点:m_PrePoint2 和第三点 point 在鼠标移动时得到 // 擦除上次的直线(因为是异或模式,所以画2次就擦除)
       m_DCCanView.MoveTo(m_PrePoint);
       m_DCCanView.LineTo(m_PrePoint2);
      //画当前直线
       //注意这里不能把系统模式设置回去,因为只有是“反抑或”模式才能被擦除。
       m_DCCanView.MoveTo(m_PrePoint);
       m_DCCanView.LineTo(point);
       m_PrePoint2 = point;
      

  8.   

    你肯定调用了SetROP2设置了画图模式,所以去掉它即可。