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);
}

转载于:https://www.cnblogs.com/burellow/archive/2012/05/21/2511496.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值