视图背景是一个位图。希望画矩形后,矩形内部不填充,保留背景,如何实现?
还有,如何擦除线条,恢复背景?

解决方案 »

  1.   

    LOGBRUSH logBrush;
    logBrush.lbStyle = NULL_BRUSH;
    logBrush.lbColor = 0;
    logBrush.lbHatch = 0;// Declare an uninitialized CBrush
    CBrush brush;
    // and initialize it with the LOGBRUSH.
    brush.CreateBrushIndirect(&logBrush);// Select the brush, and perhaps a pen into
    // the device context.
    CBrush* pOldBrush = (CBrush*)pDC->SelectObject(&brush);....pDC->SelectObject(pOldBrush);OK!
      

  2.   

    pDC->SelectObject(GetStockObject(NULL_BRUSH);
      

  3.   

    flyelf(空谷清音)正解
    选中系统库存画刷:
    pDC->SelectObject(GetStockObject(NULL_BRUSH);或
    pDC->SelectObject(GetStockObject(HOLLOW_BRUSH);都行
      

  4.   

    CDC::SelectStockObject  (NULL_BRUSH)
      

  5.   

    擦除线条,恢复背景这个最好用异或笔操作:下面是对一个矩形的移动操作,如果擦除第二段代码不需要
    CPoint point;
    COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
    CPen pen(PS_DOT, 1, XorColor), *oldpen;
    int oldmode = pDC->GetROP2();
    oldpen = pDC->SelectObject(&pen);
    pDC->SetROP2(R2_XORPEN);
    //首先删除原矩形
    pDC->MoveTo(m_x1,m_y1);//m_x1,m_x2,m_y1,m_y2是矩形四顶点的坐标这四句话
    //是擦除原来画的矩形,
    pDC->LineTo(m_x2,m_y1);
    pDC->LineTo(m_x2,m_y2);
    pDC->LineTo(m_x1,m_y2);
    pDC->LineTo(m_x1,m_y1);
    //修改新图形坐标

    m_x1 += x-m_oldx, m_y1 += y-m_oldy;//对距形进行移动并在新位置画矩形
    m_x2 += x-m_oldx, m_y1 += y-m_oldy;
    pDC->MoveTo(m_x1,m_y1);
    pDC->LineTo(m_x2,m_y1);
    pDC->LineTo(m_x2,m_y2);
    pDC->LineTo(m_x1,m_y2);
    pDC->LineTo(m_x1,m_y1);
    //以下恢复DC
    pDC->SetROP2(oldmode);
    pDC->SelectObject(oldpen);
    pen.DeleteObject();//释放笔资源
    用局部更新,或位图Bitblt速度都是较慢的,而且局部更新不容易控制
      

  6.   

    to :  zhaogaojian(米柑年成)如果背景是位图,不只是一种颜色,该如何处理?谢谢
      

  7.   

    没关系,XOR画笔不会影响背景,你在背景上画一条线遮挡背景,第二次再画上一条线
    原来的背景就又显示出来了
    0001 原来背景
    画笔1010
    1:1011
    2:XOR 1011+1010=0001;恢复背景
      

  8.   

    COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();如何获得GetPenColor(), DC中没有此函数呀??