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

原文地址:https://www.cnblogs.com/lizhengjin/p/1289218.html