📄 cellipse.cpp
字号:
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 + -