zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    ArchLinux安装
    数据库优化空间换时间优化
    SQL server 系统优化通过执行计划优化索引(2)
    SQL 语句技巧递归查询机构和下属机构的用户数
    SQL语句技巧复杂逻辑的SQL简单实现(2)
    用最少的成本获得最大收益――论DBA在企业可持续发展中的价值
    sql server性能分析定时收集系统运行情况
    SQL server 数据库自动备份
    Sql Server 2005 实现Oracle 10g的rangelist/range等组合分区功能
    关于Oracle学习以及DBA工作机会(转)
  • 原文地址:https://www.cnblogs.com/burellow/p/2511496.html
Copyright © 2011-2022 走看看