• VC画图用到的主要方法


    文章来源:http://blog.csdn.net/china_video_expert/article/details/7961732

    1。鼠标落下,记录鼠标的起始位置

    void CMyEasyDrawView::OnLButtonDown(UINT nFlags, CPoint point)
    {
     // TODO: 在此添加消息处理程序代码和/或调用默认值
     //graph->m_nType=dlg->
     m_bStartDraw = true;
     m_PtPress = m_PtLast = point;

     CView::OnLButtonDown(nFlags, point);
    }

    2.鼠标抬起,画图结束,记录下画图的所有参数

    oid CMyEasyDrawView::OnLButtonUp(UINT nFlags, CPoint point)
    {

     DrawDialog *dlg=CMainFrame::GetDrawTool();
     if (m_bStartDraw)
     {
      // 创建新图形对象
      EasyGraphics* graph = new EasyGraphics;

      // 对图形属性赋值
      graph->m_nType = m_nGraphType;
      graph->m_clrColor =dlg->m_clrColor;
      graph->m_nLineType = dlg->m_nType;
      graph->m_nLineWidth = dlg->m_lineWide;
      graph->m_PtTopLeft = m_PtPress;
      graph->m_PtBottomRight = point;

      // 添加到图形容器中
      m_GraphAry.Add(graph);

      // 一个绘制结束
      m_bStartDraw = false;

      // 让视图重绘
      Invalidate();
     }

     CView::OnLButtonUp(nFlags, point);
    }

    3.鼠标移动产生的动感

    void CMyEasyDrawView::OnMouseMove(UINT nFlags, CPoint point)
    {
     if (m_bStartDraw)
     {
      CDC* pDC = GetDC();
      int nDrawMode = pDC->SetROP2(R2_NOTXORPEN);  // 设置为“异或模式”
      DrawDialog* dlg = CMainFrame::GetDrawTool();
      EasyGraphics* graph = new EasyGraphics;   // 临时绘制对象

      // 对图形属性赋值;
      graph->m_nType = m_nGraphType;
      graph->m_clrColor =dlg->m_clrColor;
      graph->m_nLineType = dlg->m_nType;
      graph->m_nLineWidth = dlg->m_lineWide;

      graph->m_PtTopLeft = m_PtPress;
      graph->m_PtBottomRight = m_PtLast;
      DrawGraphics(pDC, graph); // 擦除上次绘制图形

      graph->m_PtBottomRight = point;
      DrawGraphics(pDC, graph); // 绘制新图形

    m_PtLast = point;   // 保存当前鼠标坐标
      pDC->SetROP2(nDrawMode);
      if(graph!=NULL)
      {
       delete graph;
       graph=NULL;
      }
      ReleaseDC(pDC);
     }

     CView::OnMouseMove(nFlags, point);
    }

    4.画图操作函数

    void CMyEasyDrawView::DrawGraphics(CDC* pDC, EasyGraphics* graph)
    {
     LOGBRUSH logBrush;
     logBrush.lbStyle = BS_SOLID;
     logBrush.lbColor = graph->m_clrColor;
     CPen pen(graph->m_nLineType |PS_GEOMETRIC|PS_ENDCAP_ROUND, 
        graph->m_nLineWidth, &logBrush);

     // 选中新的笔对象
     CPen* oldPen = pDC->SelectObject(&pen);
     
     // 使用透明画刷
     CBrush* oldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);

     switch (graph->m_nType)
     {
     case EG_RECT:  
      // 绘制矩形
      pDC->Rectangle(graph->m_PtTopLeft.x, 
            graph->m_PtTopLeft.y,
            graph->m_PtBottomRight.x,
            graph->m_PtBottomRight.y);
      break;

     case EG_CIRCLE:  
      // 绘制椭圆
      pDC->Ellipse(graph->m_PtTopLeft.x, 
          graph->m_PtTopLeft.y,
          graph->m_PtBottomRight.x,
          graph->m_PtBottomRight.y);
      break;

     default:   
      // 绘制直线
      pDC->MoveTo(graph->m_PtTopLeft);
      pDC->LineTo(graph->m_PtBottomRight);
     }

     pDC->SelectObject(oldPen);
     pDC->SelectObject(oldBrush);
    }

    5.初始设置

    void CMyEasyDrawView::OnDraw(CDC* pDC/*pDC*/)
    {
     CMyEasyDrawDoc* pDoc = GetDocument();
     ASSERT_VALID(pDoc);
     if (!pDoc)
      return;

     // TODO: 在此处为本机数据添加绘制代码
     CRect rect;
     GetClientRect(rect);

     CDC memDC;
     CBitmap MemBitmap;
     //设备描述表初始话
     memDC.CreateCompatibleDC(NULL);
     //建立与屏幕显示兼容的内存显示设备
     MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
     //选取空白位图
     memDC.SelectObject(MemBitmap);
     memDC.FillSolidRect(100,0,rect.Width(),rect.Height(),RGB(255,0,0));
     EasyGraphics* graph=NULL;
     for(INT_PTR i=0;i<m_GraphAry.GetCount();i++)
     {
      graph=(EasyGraphics*)m_GraphAry[i];
      DrawGraphics(&memDC,graph);
     }
     pDC->BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY);

    }


  • 相关阅读:
    最简单的 Java内存模型 讲解
    Chrome快捷键吐血整理
    【并发编程】InheritableThreadLocal使用详解
    【并发编程】Object的wait、notify和notifyAll方法
    【并发编程】Thread类的详细介绍
    【软件工具】easyExcel简明使用指南
    【并发编程】实现多线程的几种方式
    【并发编程】Java并发编程传送门
    CODING 研发管理系统上线全球加速,助力企业跨区域协作
    上帝的归上帝,凯撒的归凯撒—— CODING 权限管理更新
  • 原文地址:https://www.cnblogs.com/SunkingYang/p/11049259.html
Copyright © 2020-2023  润新知