zoukankan      html  css  js  c++  java
  • (4)一步一步开发一个简单CAD之画圆和矩形

    (1)圆的参数,圆心和圆上一点,即两个参数可以画一个圆

    如下

    class CCreateLine : public CComand
    {
    public:
     CCreateLine();
     virtual ~CCreateLine();
    public:

        void OnLButtonDown(UINT nFlags,  CPosition pos);
        void OnMouseMove(UINT nFlags,  CPosition pos);
        void OnRButtonDown(UINT nFlags,  CPosition pos);

     
    private:
        CPosition m_begin;
     CPosition m_end;
     CEraseLine m_erase_line;//画橡皮筋

    };

    CCreateCircle::CCreateCircle()
    {
        m_nStep = 1;
     c_Refresh = g_Refresh;

    }

    CCreateCircle::~CCreateCircle()
    {

    }

    void CCreateCircle::OnLButtonDown(UINT nFlags,  CPosition pos)
    {
       
     switch(m_nStep)
     {

     case 1://输出提示信息
     {
      m_erase_line.SetBegin(pos);//////

         CPosition center = pos;
    //        g_pDoc->DrawFlag(TRUE, pos, &center);//画标记
      m_end = m_begin = center;


             m_nStep++;
             break;
      
     }
      
      case 2:
     {
      m_erase_line.SetBegin(pos);

             CDC *pDC = g_pView->GetDC();
       CPosition center2 = pos;
    //   g_pDoc->DrawFlag(TRUE, pos, &center2);//画标记
       
       CCircle *ccircel1 = new CCircle(m_begin, center2);
           
       g_pDoc->m_solid.Add(ccircel1);
          
             m_nStep = 1;//重置
          g_pView->ReleaseDC(pDC);
           break;
      
     
     }
      default:
         break;
     }
     
      
    }

    void CCreateCircle::OnMouseMove(UINT nFlags,  CPosition pos)
    {
           CPosition center2;
    //          g_pDoc->DrawFlag(TRUE, pos, &center2);
         switch(m_nStep)
      {
      case 2:
       m_erase_line.SetEnd(pos);
             if (c_Refresh != g_Refresh)
             {
        m_end = m_begin;
        c_Refresh = g_Refresh;
             }
       CDC *pDC = g_pView->GetDC();

       CCircle *ccircel1 = new CCircle(m_begin, m_end);
       ccircel1->DrawSolid(pDC, Drag);
       delete ccircel1;
       
          CCircle *ccircel2 = new CCircle(m_begin, pos);//画像皮线,最后一个
       ccircel2->DrawSolid(pDC,Normal);
       delete ccircel2;

       m_end  = pos;
     
        
          g_pView->ReleaseDC(pDC);
     
       break;
      }
    }

    void CCreateCircle::OnRButtonDown(UINT nFlags,  CPosition pos)
    {
          CDC *pDC = g_pView->GetDC();

             CCircle *ccircel2 = new CCircle(m_begin, pos);//画像皮线,最后一个
       ccircel2->DrawSolid(pDC,Back);
       delete ccircel2;

       g_pView->ReleaseDC(pDC);

       m_nStep = 1;
    }

    (2)画矩形,左上角和右下角两个参数即可确定一个圆

    画圆的命令如下

    class CCreateRect : public CComand
    {
    public:
     CCreateRect();
     virtual ~CCreateRect();
    public:
        void OnLButtonDown(UINT nFlags,  CPosition pos);
        void OnMouseMove(UINT nFlags,  CPosition pos);
        void OnRButtonDown(UINT nFlags,  CPosition pos);
    private:
        CPosition m_begin;
     CPosition m_end;

    };

    CCreateRect::CCreateRect()
    {
        m_nStep = 1;
     c_Refresh = g_Refresh;

    }

    CCreateRect::~CCreateRect()
    {

    }

    void CCreateRect::OnLButtonDown(UINT nFlags,  CPosition pos)
    {
       
     switch(m_nStep)
     {

     case 1://输出提示信息
     {
      
         CPosition center = pos;
    //        g_pDoc->DrawFlag(TRUE, pos, &center);//画标记
      m_end = m_begin = center;


             m_nStep++;
             break;
      
     }
      
      case 2:
     {
             CDC *pDC = g_pView->GetDC();
       CPosition center2 = pos;
    //   g_pDoc->DrawFlag(TRUE, pos, &center2);//画标记
       
       CCRect *ccircel1 = new CCRect(m_begin, m_end);
           
       g_pDoc->m_solid.Add(ccircel1);
          
             m_nStep = 1;//重置
          g_pView->ReleaseDC(pDC);
           break;
      
     
     }
      default:
         break;
     }
     
      
    }

    void CCreateRect::OnMouseMove(UINT nFlags,  CPosition pos)
    {
         
         switch(m_nStep)
      {
      case 2:
      
             if (c_Refresh != g_Refresh)
             {
        m_end = m_begin;
        c_Refresh = g_Refresh;
             }
       CDC *pDC = g_pView->GetDC();

       CCRect *ccircel1 = new CCRect(m_begin, m_end);
       ccircel1->DrawSolid(pDC, Drag);
       delete ccircel1;
       
          CCRect *ccircel2 = new CCRect(m_begin, pos);//画像皮线,最后一个
       ccircel2->DrawSolid(pDC,Normal);
       delete ccircel2;

       m_end  = pos;
     
        
          g_pView->ReleaseDC(pDC);
     
       break;
      }
    }

    void CCreateRect::OnRButtonDown(UINT nFlags,  CPosition pos)
    {
          CDC *pDC = g_pView->GetDC();

             CCRect *ccircel2 = new CCRect(m_begin, pos);//画像皮线,最后一个
       ccircel2->DrawSolid(pDC,Back);
       delete ccircel2;

       g_pView->ReleaseDC(pDC);

       m_nStep = 1;
    }

  • 相关阅读:
    gcc帮助资料搜找
    由去掉word文档中的一个GoLand复制后残留的底纹说起
    记录一些有趣网站的链接
    linux cpu调度算法发展过程
    啥叫内核线程-搜集
    了解了下啥叫cfs/bfs
    c++重载运算符两种形式的选择
    概念-乐观锁、悲观锁
    go 移位操作的简单自测-移33或65位
    Shell脚本:(delayexec)Cygwin下调用schtasks创建Windows任务计划,实现延迟或定时执行某一命令
  • 原文地址:https://www.cnblogs.com/lizhengjin/p/1289218.html
Copyright © 2011-2022 走看看