⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 croundarc.cpp

📁 绘图软件
💻 CPP
字号:
#include"stdafx.h"
#include"CRoundArc.h"
#include"EastDrawView.h"
IMPLEMENT_SERIAL(CRoundArc,CUnit,1)
CRoundArc::CRoundArc()
{

}

void CRoundArc::DrawStatic(CDC *pDC)
{
  CPen m_pen;
  CBrush m_brush;
  int oldDrawingMode=pDC->SetROP2(this->m_DrawingMode);
  m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor);
  CPen* pen=(CPen*)pDC->SelectObject(&m_pen);
  LOGBRUSH brushlog;
  brushlog.lbColor=m_BrushColor;
  brushlog.lbHatch=m_BrushHatch;
  brushlog.lbStyle=m_BrushStyle;

  m_brush.CreateBrushIndirect(&brushlog);
 
  CBrush*brush=(CBrush*)pDC->SelectObject(&m_brush);
 
  int OldBkMode=pDC->SetBkMode(m_BkMode);
  COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor);
  CRect rect;
  rect.SetRect(m_CenterPoint.x-m_Xr,m_CenterPoint.y-m_Xr,m_CenterPoint.x+m_Xr,m_CenterPoint.y+m_Xr);
  pDC->Arc(rect,m_FirstPoint,m_ThirdPoint);

  pDC->SelectObject(brush);
  pDC->SelectObject(pen);
  pDC->SetBkMode(OldBkMode);
  pDC->SetBkColor(OldColor);
  pDC->SetROP2(oldDrawingMode);

}

double CRoundArc::ComputeSloap1(CPoint firstpoint, CPoint secondpoint)
{
    if(firstpoint.y==secondpoint.y)
	{
	  m_Sloap1=-9999999999999.0;
	}
	else
	{
	  m_Sloap1=-double((firstpoint.x-secondpoint.x))/double((firstpoint.y-secondpoint.y));
	}
   m_Sloap2=m_Sloap1;
   m_CenterPoint=CPoint((firstpoint.x+secondpoint.x)/2,(firstpoint.y+secondpoint.y)/2);
   m_Xr=0;//sqrt((firstpoint.x-secondpoint.x)*(firstpoint.x-secondpoint.x)+(firstpoint.y-firstpoint.y)*(firstpoint.y-firstpoint.y));
   return m_Sloap1;
}

double CRoundArc::ComputeSloap2(CPoint firstpoint, CPoint secondpoint)
{
if(firstpoint.y==secondpoint.y)
	{
	  m_Sloap2=-999999999.0;
	}
	else
	{
	 m_Sloap2=-double((firstpoint.x-secondpoint.x))/double((firstpoint.y-secondpoint.y));
	}
    
    


this->m_CenterPoint.x=((m_FirstPoint.y-m_ThirdPoint.y)/2-m_Sloap1*(m_FirstPoint.x+m_SecondPoint.x)/2+m_Sloap2*(m_SecondPoint.x+m_ThirdPoint.x)/2)/(m_Sloap2-m_Sloap1);
this->m_CenterPoint.y=((m_FirstPoint.y+m_SecondPoint.y)/2*m_Sloap2-(m_SecondPoint.y+m_ThirdPoint.y)/2*m_Sloap1+m_Sloap1*m_Sloap2*(m_ThirdPoint.x-m_FirstPoint.x)/2)/(m_Sloap2-m_Sloap1);

m_Xr=sqrt((m_CenterPoint.x-m_ThirdPoint.x)*(m_CenterPoint.x-m_ThirdPoint.x)+(m_CenterPoint.y-m_ThirdPoint.y)*(m_CenterPoint.y-m_ThirdPoint.y));	

return m_Sloap2;
}


void CRoundArc::DrawActive(CDC *pDC,CPoint point)
{
  
ShowMovingLine(pDC,m_FirstPoint,m_SecondPoint);
if(m_Xr==0)
	  return;
ShowMovingLine(pDC,m_FirstPoint,m_CenterPoint);

ShowMovingLine(pDC,m_SecondPoint,m_CenterPoint);

ShowMovingLine(pDC,m_SecondPoint,m_ThirdPoint);


  CPen m_pen;
  CBrush m_brush;
  
  m_pen.CreatePen(m_PenStyle,m_PenWidth,m_PenColor);
  CPen* pen=(CPen*)pDC->SelectObject(&m_pen);
  LOGBRUSH brushlog;
  brushlog.lbColor=m_BrushColor;
  brushlog.lbHatch=m_BrushHatch;
  brushlog.lbStyle=m_BrushStyle;

  m_brush.CreateBrushIndirect(&brushlog);
 
  CBrush*brush=(CBrush*)pDC->SelectObject(&m_brush);
 
  int OldBkMode=pDC->SetBkMode(m_BkMode);
  COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor);
  CRect rect;
  rect.SetRect(m_CenterPoint.x-m_Xr,m_CenterPoint.y-m_Xr,m_CenterPoint.x+m_Xr,m_CenterPoint.y+m_Xr);
  pDC->Arc(rect,m_FirstPoint,m_ThirdPoint);

  pDC->SelectObject(brush);
 pDC->SelectObject(pen);
 pDC->SetBkMode(OldBkMode);
 pDC->SetBkColor(OldColor);


}

void CRoundArc::Serialize(CArchive &ar)
{
	CUnit::Serialize(ar);
	if(ar.IsStoring())
	{
	 ar<<m_ThirdPoint<<m_Xr<<m_CenterPoint;
	}
	else
	{
	 ar>>m_ThirdPoint>>m_Xr>>m_CenterPoint;
	}

}

BOOL CRoundArc::IsInRgn(CPoint point)
{
 
	
   if(abs(sqrt((point.x-m_CenterPoint.x)*(point.x-m_CenterPoint.x)+(point.y-m_CenterPoint.y)*(point.y-m_CenterPoint.y))-m_Xr)<=2)
      return true;
 
   return false;

}

void CRoundArc::ShowSelectPoint(CDC *pDC)
{
CBrush brush;
brush.CreateSolidBrush(RGB(0,0,255));
CPen m_pen;
m_pen.CreatePen(PS_SOLID,1,RGB(0,0,255));
CPen *OldPen=pDC->SelectObject(&m_pen);
int oldBkMode=pDC->SetBkMode(OPAQUE); 
CBrush *OldBrush=pDC->SelectObject(&brush);
int oldDrawingMode=pDC->SetROP2(R2_NOTXORPEN);
CRect rect;
rect.SetRect(m_FirstPoint,m_FirstPoint);
rect.InflateRect(3,3);
pDC->Rectangle(rect);

rect.SetRect(m_SecondPoint,m_SecondPoint);
rect.InflateRect(3,3);
pDC->Rectangle(rect);

rect.SetRect(m_ThirdPoint,m_ThirdPoint);
rect.InflateRect(3,3);
pDC->Rectangle(rect);


  pDC->SelectObject(OldBrush);
  brush.DeleteObject();
  brush.CreateSolidBrush(RGB(255,0,0));
  pDC->SelectObject(&brush);
  rect.SetRect(this->m_CenterPoint,this->m_CenterPoint);
  rect.InflateRect(3,3);
  pDC->Rectangle(rect);
  pDC->SelectObject(OldPen);

  pDC->SetBkMode(oldBkMode); 
  pDC->SelectObject(OldBrush);
  pDC->SetROP2(oldDrawingMode);

}

int CRoundArc::IsOnMarginPoint(CPoint point)
{
CRect rect;
rect.SetRect(point,point);
rect.InflateRect(4,4);
if(rect.PtInRect(m_FirstPoint))
{   this->m_FoundPoint=m_FirstPoint;
	return 1;
}
if(rect.PtInRect(m_SecondPoint))
{   this->m_FoundPoint=m_SecondPoint;
	return 2;
}
if(rect.PtInRect(m_ThirdPoint))
{   this->m_FoundPoint=m_ThirdPoint;
	return 3;
}
if(rect.PtInRect(m_CenterPoint))
{   this->m_FoundPoint=m_CenterPoint;
	return 4;
}
return 0;
}

void CRoundArc::OnLButtonDown(CDC *pDC, CEastDrawView *pView, CPoint point)
{
   
  if(m_HaveFindFirst)
   { 
	  pView->L_iPointCount=IsOnMarginPoint(point);
     if(pView->L_iPointCount!=0)
	 {   
		 pView->m_bHaveFindSecond=true;
         pView->m_pCurrentUnit=this;
	     m_DrawingMode=pDC->GetROP2();
	     DrawActive(pDC,point); 
         ShowSelectPoint(pDC);
		 DrawOldReferencePoint(pDC,m_FoundPoint);
		 m_HaveFindFirst=true;
		 pView->m_CurrentDrawTool=RoundArc_Tool;
         pView->m_CurrentDrawStatus=Change_Status;
		 pView->m_FirstPoint=m_FirstPoint;
	     pView->m_SecondPoint=m_SecondPoint;
		 
	   if(pView->L_iPointCount==1)
	   {
	    
	   }
	   if(pView->L_iPointCount==2)
	   {
	   
	   }
	   if(pView->L_iPointCount==3)
	   {
	   }
	   if(pView->L_iPointCount==4)
	   {
	    pView->m_CurrentDrawTool=RoundArc_Tool;
        pView->m_CurrentDrawStatus=Drag_Status;
	   }
	 }//***** if(L_iPointCount!=0)
}
    if(!pView->m_bHaveFindSecond&&IsInRgn(point))
	{
		if(!m_HaveFindFirst)
		{
         m_HaveFindFirst=true;
		 pView->m_bHaveFindFirst=true;
	     ShowSelectPoint(pDC);
		}
		else
		{
		  m_HaveFindFirst=false;
		  pView->m_bHaveFindFirst=true;
		  ShowSelectPoint(pDC);
		}
	}
  
}

void CRoundArc::OnMouseMove(CDC *pDC, CEastDrawView *pView, CPoint point)
{
	  if(pView->m_CurrentDrawStatus==Drag_Status)
	  {
	  m_FirstPoint.Offset(pView->m_SecondPoint.x-pView->m_FirstPoint.x,pView->m_SecondPoint.y-pView->m_FirstPoint.y);
      m_SecondPoint.Offset(pView->m_SecondPoint.x-pView->m_FirstPoint.x,pView->m_SecondPoint.y-pView->m_FirstPoint.y);
	  m_ThirdPoint.Offset(pView->m_SecondPoint.x-pView->m_FirstPoint.x,pView->m_SecondPoint.y-pView->m_FirstPoint.y);
      m_CenterPoint.Offset(pView->m_SecondPoint.x-pView->m_FirstPoint.x,pView->m_SecondPoint.y-pView->m_FirstPoint.y);
	  }
	  else
	  {
	  pDC->SetROP2(R2_NOTXORPEN);
      if(pView->m_LBDownTimes==1&&pView->m_CurrentDrawStatus!=Change_Status)
	  {
		  ShowMovingLine(pDC,pView->m_FirstPoint,pView->m_SecondPoint);
		  pView->m_SecondPoint=point;
		  ShowMovingLine(pDC,pView->m_FirstPoint,point);
	  }
	  if(pView->m_LBDownTimes==2&&pView->m_CurrentDrawStatus!=Change_Status)
	  {
	      DrawActive(pDC,point);
		  m_ThirdPoint=point;
		  ComputeSloap2(m_SecondPoint,m_ThirdPoint);
          DrawActive(pDC,point);
	  }
   if(pView->m_CurrentDrawStatus==Change_Status)
	  {
	    DrawActive(pDC,point);
	    if(pView->L_iPointCount==1)
		{
		  m_FirstPoint=point;
		  ComputeSloap1(m_FirstPoint,m_SecondPoint);
          ComputeSloap2(m_SecondPoint,m_ThirdPoint);
		}
	    if(pView->L_iPointCount==2)
		{
		  m_SecondPoint=point;
          ComputeSloap1(m_FirstPoint,m_SecondPoint);
		  ComputeSloap2(m_SecondPoint,m_ThirdPoint);
		}
		if(pView->L_iPointCount==3)
		{
		 m_ThirdPoint=point;
		 ComputeSloap2(m_SecondPoint,m_ThirdPoint);
		}
	     DrawActive(pDC,point);
		 pView->m_SecondPoint=point;
   }//******if(m_CurrentDrawStatus==Exchange_Status)
	  }
	  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -