各位高手:
  模态对话框中的CListCtrl控件中设置了背景位图,并画了很多条直线,怎样在不同位置重画其中一条线使原来位置上的线消失,并保持背景? 最好给出例子代码.
  高分求教!

解决方案 »

  1.   

    创建画笔的时候用xor,擦的时候再画一遍就行了
      

  2.   

    BOOL CMyView::ReDrawRect(CRect Oldrect)
    {
    CDC *pdc = GetDC();
    CPen pen, *oldPen = NULL;

    pen.CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
    oldPen = pdc->SelectObject(&pen);
    INT OldMode = pdc->SetROP2(R2_XORPEN);

    pdc->MoveTo(Oldrect.TopLeft());
    pdc->LineTo(Oldrect.right, Oldrect.top);
    pdc->MoveTo(Oldrect.right, Oldrect.top);
    pdc->LineTo(Oldrect.BottomRight());
    pdc->MoveTo(Oldrect.BottomRight());
    pdc->LineTo(Oldrect.left, Oldrect.bottom);
    pdc->MoveTo(Oldrect.left, Oldrect.bottom);
    pdc->LineTo(Oldrect.TopLeft());

    pdc->SetROP2(OldMode);
    pdc->SelectObject(oldPen);
    ReleaseDC(pdc);

    return TRUE;
    }
    同样的位置画两遍就好了
      

  3.   

    CPen pen(PS_SOLID, 0, RGB(0,255,0));
    CPen* pOldPen=pDC->SelectObject(&pen);
    CBrush* pOldBrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
    int nOldDrawMode=pDC->SetROP2(R2_XORPEN);
    ...//绘制代码
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldBrush);
    pDC->SetROP2(nOldDrawMode);
      

  4.   

    按各位指导的方法直接在显示CDC上画2次实现了使直线消失,但是直接在显示CDC上画线界面切换后就使需要的线段也消失了;
    所以我在内存CDC上画线后拷贝到显示CDC.结果使直线消失出现了问题.
    在自定义函数OnDrawLine()中内存CDC上创建画笔的时候用xor,结果什么线都画不出,
    在系统函数OnDraw(CDC* pDC)中显示CDC上加上一句int nOldDrawMode=pDC->SetROP2(R2_XORPEN),函数OnDrawLine()中屏蔽掉相关语句, 结果重画第2次不能使直线消失,
    请高手们指导.
    代码如下:m_pMemDC和m_pBitmap 是全局变量:int CMyView::OnCreate(LPCREATESTRUCT lpCreateStruct) {
    .....
      m_nMaxX = GetSystemMetrics(SM_CXSCREEN);
      m_nMaxY = GetSystemMetrics(SM_CYSCREEN);
      CDC* pDC = GetDC();
      m_pMemDC->CreateCompatibleDC(pDC);
      m_pBitmap->CreateCompatibleBitmap(pDC,m_nMaxX,m_nMaxY);
    ....
    }
    void CLineTstView::OnDraw(CDC* pDC)
    {
    ....
    CBitmap* pOldBitmap = m_pMemDC->SelectObject(m_pBitmap); pDC->BitBlt(0,0,m_nMaxX,
    m_nMaxY,m_pMemDC,0,0,SRCCOPY);
    m_pMemDC->SelectObject(pOldBitmap);
    }void CMyView::OnDrawLine() 
    {
    CBitmap* pOldBitmap = m_pMemDC->SelectObject(m_pBitmap);
    CPen pen;
    pen.CreatePen(PS_SOLID,m_nLineWidth,m_cLineColor);
    CPen* pOldPen = m_pMemDC->SelectObject(&pen);
    CBrush* pOldBrush = (CBrush*)m_pMemDC->SelectStockObject(NULL_BRUSH); int nOldDrawMode=m_pMemDC->SetROP2(R2_XORPEN); m_pMemDC->MoveTo(m_ptStart);
    m_pMemDC->LineTo(point); Invalidate(FALSE); m_pMemDC->SelectObject(pOldBitmap);
    m_pMemDC->SelectObject(pOldPen);
    m_pMemDC->SelectObject(pOldBrush);
    m_pMemDC->SetROP2(nOldDrawMode);
    }
      

  5.   

    你应该将内存的 绘图上下文传递给函数,而不能直接用OnDraw(CDC *pDC);
      

  6.   

    zhaogaojian(米柑年成):
       能否具体点,将内存的绘图上下文传递给什么函数? 给几句代码.