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

📄 cellipse.cpp

📁 绘图软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
  
      double xy1[3]={m_CenterPoint.x,m_CenterPoint.y,1};
	  m_OffSetX=vh[0][0]*xy1[0]+vh[0][1]*xy1[1]+vh[0][2]*xy1[2];
	  m_OffSetY=vh[1][0]*xy1[0]+vh[1][1]*xy1[1]+vh[1][2]*xy1[2];
	  

}

void CEllipse::ShowSelectPoint(CDC *pDC)
{
 double vh[3][3]={m_Cos,-m_Sin,m_CenterPoint.x*(1-m_Cos)+m_CenterPoint.y*m_Sin,
		               m_Sin, m_Cos,m_CenterPoint.y*(1-m_Cos)-m_CenterPoint.x*m_Sin,
					   0,0,1
	                  };       
  
      double xy1[3]={-m_Xr+this->m_CenterPoint.x,this->m_CenterPoint.y,1};
	  this->m_MarginPoint[0].x=vh[0][0]*xy1[0]+vh[0][1]*xy1[1]+vh[0][2]*xy1[2];
	  this->m_MarginPoint[0].y=vh[1][0]*xy1[0]+vh[1][1]*xy1[1]+vh[1][2]*xy1[2];
      
	  double xy2[3]={this->m_CenterPoint.x,this->m_CenterPoint.y-m_Yr,1};
      this->m_MarginPoint[1].x=vh[0][0]*xy2[0]+vh[0][1]*xy2[1]+vh[0][2]*xy2[2];
	  this->m_MarginPoint[1].y=vh[1][0]*xy2[0]+vh[1][1]*xy2[1]+vh[1][2]*xy2[2]; 

	  double xy3[3]={this->m_CenterPoint.x+m_Xr,this->m_CenterPoint.y,1};
	  this->m_MarginPoint[2].x=vh[0][0]*xy3[0]+vh[0][1]*xy3[1]+vh[0][2]*xy3[2];
	  this->m_MarginPoint[2].y=vh[1][0]*xy3[0]+vh[1][1]*xy3[1]+vh[1][2]*xy3[2];
   
	  double xy4[3]={this->m_CenterPoint.x,m_Yr+this->m_CenterPoint.y,1};
      this->m_MarginPoint[3].x=vh[0][0]*xy4[0]+vh[0][1]*xy4[1]+vh[0][2]*xy4[2];
	  this->m_MarginPoint[3].y=vh[1][0]*xy4[0]+vh[1][1]*xy4[1]+vh[1][2]*xy4[2];

	  double xy5[3]={this->m_CenterPoint.x,this->m_CenterPoint.y,1};
      this->m_MarginPoint[4].x=vh[0][0]*xy5[0]+vh[0][1]*xy5[1]+vh[0][2]*xy5[2];
	  this->m_MarginPoint[4].y=vh[1][0]*xy5[0]+vh[1][1]*xy5[1]+vh[1][2]*xy5[2];
	
	
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;
 for(int i=0;i<4;i++)
 {
  rect.SetRect(this->m_MarginPoint[i],this->m_MarginPoint[i]);
  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_MarginPoint[4],this->m_MarginPoint[4]);
  rect.InflateRect(3,3);
  pDC->Rectangle(rect);
pDC->SelectObject(OldPen);
pDC->SetBkMode(oldBkMode); 
pDC->SelectObject(OldBrush);
pDC->SetROP2(oldDrawingMode);
}

CRect CEllipse::GetBoundingRect()
{
double vh[3][3]={m_Cos,-m_Sin,m_CenterPoint.x*(1-m_Cos)+m_CenterPoint.y*m_Sin,
		               m_Sin, m_Cos,m_CenterPoint.y*(1-m_Cos)-m_CenterPoint.x*m_Sin,
					   0,0,1
	                  };       
  
      double xy1[3]={-m_Xr+this->m_CenterPoint.x,this->m_CenterPoint.y-m_Yr,1};
	  int left=vh[0][0]*xy1[0]+vh[0][1]*xy1[1]+vh[0][2]*xy1[2];
	  int top=vh[1][0]*xy1[0]+vh[1][1]*xy1[1]+vh[1][2]*xy1[2];
      
	  double xy2[3]={this->m_CenterPoint.x+m_Xr,this->m_CenterPoint.y-m_Yr,1};
      int left2=vh[0][0]*xy2[0]+vh[0][1]*xy2[1]+vh[0][2]*xy2[2];
	  int top2=vh[1][0]*xy2[0]+vh[1][1]*xy2[1]+vh[1][2]*xy2[2]; 

	  double xy3[3]={this->m_CenterPoint.x+m_Xr,this->m_CenterPoint.y+m_Yr,1};
	  int right=vh[0][0]*xy3[0]+vh[0][1]*xy3[1]+vh[0][2]*xy3[2];
	  int bottom=vh[1][0]*xy3[0]+vh[1][1]*xy3[1]+vh[1][2]*xy3[2];
   
	  double xy4[3]={this->m_CenterPoint.x-m_Xr,m_Yr+this->m_CenterPoint.y,1};
      int right2=vh[0][0]*xy4[0]+vh[0][1]*xy4[1]+vh[0][2]*xy4[2];
	  int bottom2=vh[1][0]*xy4[0]+vh[1][1]*xy4[1]+vh[1][2]*xy4[2];



     
	 int miny=min(min(top,top2),min(bottom,bottom2));
	 int minx=min(min(right,right2),min(left,left2));
	 int maxy=max(max(top,top2),max(bottom,bottom2));
	 int maxx=max(max(right,right2),max(left,left2));

	  m_BoundingRect.left=minx;
	  m_BoundingRect.top=miny;
	  m_BoundingRect.right=maxx;
	  m_BoundingRect.bottom=maxy;
	  
  return this->m_BoundingRect;
  

}

void CEllipse::DrawActive(CDC *pDC,CPoint point)
{
  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);
  SetBrushOrg(pDC,&m_brush);
  CBrush*brush=(CBrush*)pDC->SelectObject(&m_brush);
 
 int OldBkMode=pDC->SetBkMode(m_BkMode);
 COLORREF OldColor=pDC->SetBkColor(m_BackgroundColor);
 
 ellipseMidpoint(pDC,m_CenterPoint.x,m_CenterPoint.y,this->m_Xr,this->m_Yr);
 pDC->SelectObject(brush);
 pDC->SelectObject(pen);
 pDC->SetBkMode(OldBkMode);
 pDC->SetBkColor(OldColor);
 
}

void CEllipse::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_CurrentDrawTool=Ellipse_Tool;
        pView->m_CurrentDrawStatus=Change_Status;
	  
	switch(pView->L_iPointCount)
	{
	   case 1:
	   pView->m_FirstPoint=m_SecondPoint;
	   pView->m_SecondPoint=m_FirstPoint;
	   break;

	   case 2:
	   pView->m_FirstPoint=m_FirstPoint;
	   pView->m_SecondPoint=m_SecondPoint;
	   break;
	   
	   case 3:
	   pView->m_FirstPoint=m_FirstPoint;
	   pView->m_SecondPoint=m_SecondPoint;
	   break;

	   case 4:
	   pView->m_FirstPoint=m_SecondPoint;
	   pView->m_SecondPoint=m_FirstPoint;
	   break;

	   case 5:
	   pView->m_FirstPoint=m_FirstPoint;
	   pView->m_SecondPoint=m_SecondPoint;
       pView->m_CurrentDrawTool=Ellipse_Tool;
       pView->m_CurrentDrawStatus=Drag_Status;
	  break;
	}
	 }//******if(L_iPointCount!=0)
	}//**********if(L_pEllipse->m_HaveFindFirst)
  
     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);
	   }
	 }
 
   if(pView->m_bHaveFindSecond)
		{   
	        pView->m_pCurrentUnit=this;
			m_DrawingMode=pDC->GetROP2();
	        DrawStatic(pDC);
			DrawOldReferencePoint(pDC,m_FoundPoint);
		    ShowSelectPoint(pDC);
	    }
  
}

 void CEllipse::OnMouseMove(CDC *pDC, CEastDrawView *pView, CPoint point)
{
    if(pView->m_CurrentDrawStatus==Drag_Status)
	{
       if(!m_IsCirCu)
		   m_CenterPoint.Offset((pView->m_SecondPoint.x-pView->m_FirstPoint.x),(pView->m_SecondPoint.y-pView->m_FirstPoint.y)); 
	   if(m_IsCirCu)
		   ComputSloap(m_CenterPoint,point);
	}
	else
	  {
	      //pDC->SetROP2(R2_NOTXORPEN);
		 if(pView->m_LBDownTimes==2&&pView->m_CurrentDrawStatus!=Change_Status)
		  {
		 
		  ShowMovingLine(pDC,m_CenterPoint,point);
		  ellipseMidpoint(pDC,m_CenterPoint.x,m_CenterPoint.y,m_Xr,m_Yr);
	      ComputRadiusX(m_CenterPoint,point);
		  //m_DrawingMode=pDC->GetROP2();
		  pView->m_SecondPoint=point;
		  ellipseMidpoint(pDC,m_CenterPoint.x,m_CenterPoint.y,m_Xr,m_Yr);
		  ShowMovingLine(pDC,m_CenterPoint,point);
		 }
		 if(pView->m_CurrentDrawStatus==Change_Status)
		 {
		 
		 ellipseMidpoint(pDC,m_CenterPoint.x,m_CenterPoint.y,m_Xr,m_Yr);
		 
	    ShowMovingLine(pDC,m_CenterPoint,pView->m_SecondPoint);
		
	      pView->m_SecondPoint=point;
		  if(pView->L_iPointCount==1||pView->L_iPointCount==3)
		  ComputRadiusX(m_CenterPoint,point);
		  if(pView->L_iPointCount==2||pView->L_iPointCount==4)
          ComputRadiusY(m_CenterPoint,point);
		  
		  //m_DrawingMode=pDC->GetROP2();
		  ShowMovingLine(pDC,m_CenterPoint,point);
		  
		  
		      ellipseMidpoint(pDC,m_CenterPoint.x,m_CenterPoint.y,m_Xr,m_Yr);
		  }
		 
		 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);
		 }

	  }
}

void CEllipse::OnMenuitemCirCu(CDC *pDC, CEastDrawView *pView)
{
  m_IsCirCu=!m_IsCirCu;
}

CEllipse::CEllipse()
{
	CUnit::Initial();
	m_IsCirCu=false;
}



void CEllipse::OnContextMenu(CWnd *pWnd, CPoint point)
{
CEastDrawView*pView=(CEastDrawView*)pWnd;
if(pView->m_CurrentDrawStatus==Drag_Status)
{
CMenu menuTextEdit;
menuTextEdit.LoadMenu(IDR_MENU_Canvas_Edit);
menuTextEdit.CheckMenuItem(ID_CirCu,m_IsCirCu?MF_CHECKED:MF_UNCHECKED);
menuTextEdit.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,pWnd);
}
}

⌨️ 快捷键说明

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