📄 circle.cpp
字号:
// circle.cpp : implementation of the CPaintCircle and CPaintEllipse classes
//
#include "stdafx.h"
#include "const.h"
#include "painted.h"
#include "paintobj.h"
#include "paintdoc.h"
#include "SearchPath.h"
#include "SearchNode.h"
#include "paintvw.h"
#include "circle.h"
#include "FillColorStatic.h"
#include "EllipseAttrDlg.h"
#include "DeviceEllipseAttrDlg.h"
#include <math.h>
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
extern double fscale;
extern void DPtoVP(CPnt pnt,CPoint& point);
extern void VPtoDP(CPoint point,CPnt& pnt);
/////////////////////////////////////////////////////////////////////////////
// CPaintCircle
/*
IMPLEMENT_SERIAL(CPaintCircle, CPainted, VERSIONABLE_SCHEMA)
CPaintCircle::CPaintCircle(BOOL bFilled)
{
m_rgbInside = RGB(127, 127, 127);
m_bFilled = bFilled;
}
void CPaintCircle::Draw(CDC* pDC)
{
CPen* pOldPen;
CPen DrawPen;
CBrush* pOldBrush;
CBrush DrawBrush;
DrawPen.CreatePen(PS_SOLID, int(fscale*m_nWidth), m_rgbPrimary);
pOldPen = pDC->SelectObject(&DrawPen);
if (m_bFilled)
{
DrawBrush.CreateSolidBrush(m_rgbInside);
pOldBrush = pDC->SelectObject(&DrawBrush);
}
else
{
pOldBrush = (CBrush*) pDC->SelectStockObject(HOLLOW_BRUSH);
}
CPoint m_pointPrimary1;
CPoint m_pointLower1;
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointLower,m_pointLower1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->Ellipse(m_pointPrimary1.x,m_pointPrimary1.y,m_pointLower1.x,m_pointLower1.y);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CPaintCircle::MoveDraw(CDC* pDC, CPnt& p1,CPnt& p2)
{
}
void CPaintCircle::DragDraw(CDC* pDC, CPnt& pointDragged)
{
int nOldROPMode = pDC->SetROP2(R2_NOT);
int nOldBkMode= pDC->SetBkMode(TRANSPARENT);
CPen* pOldPen;
CPen pDrawPen;
CPoint m_pointPrimary1;
CPoint m_pointLower1;
pDC->SelectStockObject(HOLLOW_BRUSH);
pDrawPen.CreatePen(PS_SOLID, int(fscale*m_nWidth), m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointLower,m_pointLower1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->Ellipse(m_pointPrimary1.x,m_pointPrimary1.y,m_pointLower1.x,m_pointLower1.y);
double nXOffset = max(
(double) fabs(m_pointPrimary.x - pointDragged.x),
(double) fabs(m_pointPrimary.y - pointDragged.y));
double nYOffset = nXOffset;
m_pointLower.x = m_pointPrimary.x;
m_pointLower.y = m_pointPrimary.y;
if (m_pointPrimary.x > pointDragged.x)
{
nXOffset = -nXOffset;
}
if (m_pointPrimary.y > pointDragged.y)
{
nYOffset = -nYOffset;
}
// m_pointLower.Offset(nXOffset, nYOffset);
m_pointLower.x+=nXOffset;
m_pointLower.y+=nYOffset;
pDC->SetROP2(nOldROPMode);
pDC->SetBkMode(nOldBkMode);
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointLower,m_pointLower1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->Ellipse(m_pointPrimary1.x,m_pointPrimary1.y,m_pointLower1.x,m_pointLower1.y);
pDC->SelectObject(pOldPen);
}
void CPaintCircle::DrawSelected(CDC* pDC)
{
CPen* pOldPen;
CPen DrawPen;
CBrush* pOldBrush;
CBrush DrawBrush;
DrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
pOldPen = pDC->SelectObject(&DrawPen);
DrawBrush.CreateHatchBrush(HS_FDIAGONAL, 0);
pOldBrush = pDC->SelectObject(&DrawBrush);
CPoint m_pointPrimary1;
CPoint m_pointLower1;
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointLower,m_pointLower1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->Ellipse(m_pointPrimary1.x,m_pointPrimary1.y,m_pointLower1.x,m_pointLower1.y);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CPaintCircle::OnDown(CPnt& pointDown)
{
// m_pointPrimary = m_pointLower = pointDown;
m_pointLower.x = m_pointPrimary.x = pointDown.x;
m_pointLower.y = m_pointPrimary.y = pointDown.y;
}
void CPaintCircle::OnDown2(CPnt& pointDown)
{
}
void CPaintCircle::OnUp(CPnt& pointUp, CWnd* pWnd)
{
NormalizePoints(m_pointPrimary, m_pointLower);
CClientDC tempDC(pWnd);
Draw(&tempDC);
}
void CPaintCircle::onup1(CPnt& point1, CPnt& point2,CPnt& point3, CWnd *pWnd)
{ m_pointPrimary=point1;
m_pointLower=point2;
// NormalizePoints(m_pointPrimary, m_pointLower);
CClientDC tempDC(pWnd);
Draw(&tempDC);
}
CPnt CPaintCircle::returnattr1()
{
return m_pointPrimary;
}
CPnt CPaintCircle::returnattr2()
{
return m_pointLower;
}
//得到路径的绘制起点
int CPaintCircle::GetPathStartnode(CPnt& pnt1, CPnt& pnt2)
{
return 1;
}
//得到路径的绘制终点
BOOL CPaintCircle::GetPathEndnode(CPnt& pnt1)
{
return 1;
}
BOOL CPaintCircle::IsHit(CPnt& pointBang)
{
CRect rect((int)m_pointPrimary.x, (int)m_pointPrimary.y, (int)m_pointLower.x, (int)m_pointLower.y);
CPoint pointBang1;
pointBang1.x=(UINT) pointBang.x;
pointBang1.y=(UINT) pointBang.y;
if (!rect.PtInRect(pointBang1))
return FALSE;
double dCenterX = (double) rect.left+rect.Width()/2.0;
double dCenterY = (double) rect.top+rect.Height()/2.0 ;
double dDist = pow(((double) pointBang.x - dCenterX) / (rect.Width()/2.0), 2.0) +
pow(((double) pointBang.y - dCenterY) / (rect.Height()/2.0), 2.0);
if (dDist <= 1.0000)
{ m_bhitarc=FALSE;//TRUE表示正圆弧被选中
return TRUE;
}
else
{
return FALSE;
}
}
void CPaintCircle::GetBoundingRect(double &minx,double &miny,double &maxx,double &maxy)
{
// pRect->top = m_pointPrimary.y;
// pRect->left = m_pointPrimary.x;
// pRect->bottom = m_pointLower.y;
// pRect->right = m_pointLower.x;
}
void CPaintCircle::Serialize(CArchive& ar)
{
CPainted::Serialize(ar);
if (ar.IsStoring())
{
ar << m_pointLower;
ar << m_rgbInside;
ar << (WORD) m_bFilled;
}
else
{
ar >> m_pointLower;
ar >> m_rgbInside;
ar >> (WORD&) m_bFilled;
}
}
*/
/////////////////////////////////////////////////////////////////////////////
// CPaintCircle
IMPLEMENT_SERIAL(CPaintEllipse, CObject, VERSIONABLE_SCHEMA)
CPaintEllipse::CPaintEllipse()
{
m_bFilled=TRUE;
m_rgbInside=RGB(125,125,125);
}
CPaintEllipse::~CPaintEllipse()
{
}
void CPaintEllipse::Draw(CDC* pDC)
{
CPen* pOldPen;
CPen DrawPen;
CBrush* pOldBrush;
CBrush DrawBrush;
DrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
pOldPen = pDC->SelectObject(&DrawPen);
if (m_bFilled)
{
DrawBrush.CreateSolidBrush(m_rgbInside);
pOldBrush = pDC->SelectObject(&DrawBrush);
}
else
{
pOldBrush = (CBrush *) pDC->SelectStockObject(WHITE_BRUSH);
}
CPoint m_pointPrimary1;
CPoint m_pointEnd1;
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->Ellipse(m_pointPrimary1.x,m_pointPrimary1.y,m_pointEnd1.x,m_pointEnd1.y);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CPaintEllipse::DragDraw(CDC* pDC, CPnt& pointDragged)
{
pDC->SetROP2(R2_NOT);
CPen* pOldPen;
CPen pDrawPen;
CBrush DrawBrush;
CPoint m_pointPrimary1;
CPoint m_pointEnd1;
pDC->SelectStockObject(HOLLOW_BRUSH);
pDrawPen.CreatePen(PS_SOLID, int(fscale*m_nWidth), m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->Ellipse(m_pointPrimary1.x,m_pointPrimary1.y,m_pointEnd1.x,m_pointEnd1.y);
m_pointEnd.x = pointDragged.x;
m_pointEnd.y = pointDragged.y;
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDC->Ellipse(m_pointPrimary1.x,m_pointPrimary1.y,m_pointEnd1.x,m_pointEnd1.y);
pDC->SelectObject(pOldPen);
}
void CPaintEllipse::Move(double x_Move,double y_Move)
{
//移动起点和终点坐标
m_pointPrimary.x+=x_Move;
m_pointEnd.x+=x_Move;
m_pointPrimary.y+=y_Move;
m_pointEnd.y+=y_Move;
}
void CPaintEllipse::MoveDraw(CDC* pDC, CPnt& p1,CPnt& p2)
{
pDC->SetROP2(R2_XORPEN);//R2_XORPEN
CPen* pOldPen;
CPen pDrawPen;
CPoint m_pp1;
CPoint m_pp2;
CPoint pp1;
CPoint pp2;
DPtoVP(m_p1,m_pp1);
DPtoVP(m_p2,m_pp2);//把最终实际坐标变换为用于显示的逻辑坐标
DPtoVP(p1,pp1);
DPtoVP(p2,pp2);
pDrawPen.CreatePen(PS_DOT, 0, m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
if(m_bFirstMove)//第一次移动
{
m_bFirstMove=FALSE;
pDC->MoveTo(pp1.x,pp1.y);
pDC->LineTo(pp2.x,pp2.y);
}
else
{
pDC->MoveTo(m_pp1.x,m_pp1.y);
pDC->LineTo(m_pp2.x,m_pp2.y);
pDC->MoveTo(pp1.x,pp1.y);
pDC->LineTo(pp2.x,pp2.y);
}
m_p1=p1;
m_p2=p2;
pDC->SelectObject(pOldPen);
}
void CPaintEllipse::DrawSelected(CDC* pDC, void* pTemp)
{
pDC->SetROP2(R2_COPYPEN);
CPen* pOldPen;
CPen pDrawPen;
CBrush* pOldBrush;
CBrush DrawBrush;
DrawBrush.CreateHatchBrush(HS_FDIAGONAL, 0);
pOldBrush = pDC->SelectObject(&DrawBrush);
CPoint m_pointPrimary1,m_pointEnd1;
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
// pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
// pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);
pDC->Ellipse(m_pointPrimary1.x, m_pointPrimary1.y,
m_pointEnd1.x,m_pointEnd1.y);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
/*
void CPaintEllipse::DrawSpecialNode(CDC* pDC)//显示断点非相切点
{
CPen* pOldPen;
CPen pDrawPen;
CBrush* pOldBrush;
pOldBrush = (CBrush *) pDC->SelectStockObject(WHITE_BRUSH);
CPoint m_pointPrimary1;
CPoint m_pointEnd1;
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);
//起点状态0=相切点1=非相切点2=断点
if(m_uStartNodeState==2)//断点
{
pDC->MoveTo(m_pointPrimary1.x-3,m_pointPrimary1.y-3);
pDC->LineTo(m_pointPrimary1.x+4,m_pointPrimary1.y+4);
pDC->MoveTo(m_pointPrimary1.x-3,m_pointPrimary1.y+3);
pDC->LineTo(m_pointPrimary1.x+4,m_pointPrimary1.y-4);
}
else if(m_uStartNodeState==1)//非相切点
{
pDC->Rectangle(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
}
//终点状态0=相切点1=非相切点2=断点
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -