• 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);
    }
  • 相关阅读:
    一文摸透从输入URL到页面渲染的过程
    JavaScript实现哈希表
    JavaScript数据结构与算法博客目录
    JavaScript实现图结构
    从宏观到细节为你讲解前端性能优化
    详解HTTP协议
    JavaScript实现排序算法
    Google Stadia免费试用两个月
    安卓手机调成黑白屏幕
    UWP Xbox上隐藏键盘⌨
  • 原文地址:https://www.cnblogs.com/burellow/p/2511496.html
Copyright © 2020-2023  润新知