VC++用异或(XOR)方式实现拖放画动态直线

// 类变量
class CDrawView : public CView {
       //……
protected:
       BOOL m_bLButtonDown, m_bErase; // 判断是否按下左鼠标键
//和是否需要擦除图形的类变量
       CPoint p0, pm; // 记录直线起点和动态终点的类变量
       CPen * pGrayPen, * pLinePen; // 定义灰色和直线笔
       //……
}
// 构造函数
CDrawView::CDrawView() {
       m_bLButtonDown = FALSE; // 设左鼠标键按下为假
       m_bErase = FALSE; // 设需要擦除为假
       pGrayPen = new CPen(PS_SOLID, 0, #808080);// 创建灰色笔
       pLinePen = new CPen(PS_SOLID, 0, #ff0000);// 创建红色的直线笔
}
// 鼠标消息响应函数
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) {
       m_bLButtonDown = TRUE; // 设左鼠标键按下为真
       SetCapture(); // 设置鼠标捕获
       // SetCursor(LoadCursor(NULL, IDC_CROSS)); // 设置鼠标为十字
       p0 = point; // 保存矩形左上角
       pm = p0; // 让矩形右下角等于左上角
       CView::OnLButtonDown(nFlags, point);
}
void CDrawView::OnMouseMove(UINT nFlags, CPoint point) {
       SetCursor(LoadCursor(NULL, IDC_CROSS)); // 设置鼠标为十字
       if (m_bLButtonDown) { // 左鼠标键按下为真
              CDC* pDC = GetDC(); // 获取设备上下文
              pDC->SelectObject(pGrayPen);// 选取灰色笔
              pDC->SetROP2(R2_XORPEN);// 设置为异或绘图方式
              if (m_bErase) { // 需要擦除为真
                     pDC->MoveTo(p0); pDC->LineTo(pm); // 擦除原直线
              }
              else // 需要擦除为假
                     m_bErase = TRUE; // 设需要擦除为真
              pDC->MoveTo(p0); pDC->LineTo(point); // 绘制新直线
              pm = point; // 记录老终点
              ReleaseDC(pDC); // 释放设备上下文
       }
       CView::OnMouseMove(nFlags, point);
}
void CDrawView::OnLButtonUp(UINT nFlags, CPoint point) {
       ReleaseCapture(); // 释放鼠标捕获
       if (m_bLButtonDown) { // 左鼠标键按下为真
              CDC* pDC = GetDC(); // 获取设备上下文
              pDC->SelectObject(pGrayPen);// 选取灰色笔
              pDC->SetROP2(R2_XORPEN); // 设置为异或绘图方式
              pDC->MoveTo(p0); pDC->LineTo(pm); // 擦除原直线
              pDC->SelectObject(pLinePen); // 选择直线笔
              pDC->SetROP2(R2_COPYPEN);// 设置为覆盖绘图方式
              pDC->MoveTo(p0); pDC->LineTo(point); // 绘制最终的直线
              m_bLButtonDown = FALSE; // 重设左鼠标键按下为假
              m_bErase = FALSE; // 重需要擦除为假
              ReleaseDC(pDC); // 释放设备上下文
       }
       CView::OnLButtonUp(nFlags, point);
}

posted on 2012-05-21 13:09  burellow  阅读(773)  评论(0编辑  收藏  举报

导航