📄 paintscp.cpp
字号:
// PaintScp.cpp: implementation of the CPaintScp class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "const.h"
#include "paintobj.h"
#include "painted.h"
#include "paintdoc.h"
#include "SearchPath.h"
#include "SearchNode.h"
#include "paintvw.h"
#include "math.h"
#include "PaintScp.h"
#include "ScpAttrDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern double fscale;
extern void DPtoVPf(CPnt pnt,CPnt& point);
extern void DPtoVP(CPnt pnt,CPoint& point);
extern void VPtoDP(CPoint point,CPnt& pnt);
extern double Distance(int x1, int y1, int x2, int y2);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CPaintScp, CObject, VERSIONABLE_SCHEMA)
CPaintScp::CPaintScp()
{
}
CPaintScp::~CPaintScp()
{
}
void CPaintScp::Draw(CDC* pDC)
{
pDC->SetROP2(R2_COPYPEN);
CPen* pOldPen;
CPen pDrawPen;
pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
CPnt pntt,pntEnd;
DPtoVPf(m_pointEnd,pntEnd);//把最终实际坐标变换为用于显示的逻辑坐标
Transform1(pntEnd,pntt);
double mm=pntt.x;
double nn=pntt.y;
CPnt pxy;
CPnt pdraw;
if(mm>0)
{
for(int jj=0;jj<=mm;jj++)
{
pxy.x=double(jj);
pxy.y=calculate(pxy.x,mm,nn);
Transform(pxy,pdraw);//坐标变换
if(jj==0)
{
pDC->MoveTo(int(pdraw.x),int(pdraw.y));
}
pDC->LineTo(int(pdraw.x),int(pdraw.y));
}
}
else
{
for(int jj=0;jj>=mm;jj--)
{
pxy.x=double(jj);
pxy.y=calculate(pxy.x,mm,nn);
Transform(pxy,pdraw);//坐标变换
if(jj==0)
{
pDC->MoveTo(int(pdraw.x),int(pdraw.y));
}
pDC->LineTo(int(pdraw.x),int(pdraw.y));
}
}
pDC->SelectObject(pOldPen);
}
void CPaintScp::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 CPaintScp::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 CPaintScp::DragDraw(CDC* pDC, CPnt& pointDragged)
{
pDC->SetROP2(R2_NOT);//R2_XORPEN R2_NOTMASKPEN
CPen* pOldPen;
CPen pDrawPen;
pDrawPen.CreatePen(PS_SOLID, int(fscale*m_nWidth)>2? 1:1, m_rgbPrimary);
pOldPen = pDC->SelectObject(&pDrawPen);
CPnt pntt,pntEnd;
DPtoVPf(m_pointEnd,pntEnd);//把最终实际坐标变换为用于显示的逻辑坐标
Transform1(pntEnd,pntt);
double mm=pntt.x;
double nn=pntt.y;
CPnt pxy;
CPnt pdraw;
if(mm>0)
{
for(int jj=0;jj<=mm;jj++)
{
pxy.x=double(jj);
pxy.y=calculate(pxy.x,mm,nn);
Transform(pxy,pdraw);//坐标变换
if(jj==0)
{
pDC->MoveTo(int(pdraw.x),int(pdraw.y));
}
pDC->LineTo(int(pdraw.x),int(pdraw.y));
}
}
else
{
for(int jj=0;jj>=mm;jj--)
{
pxy.x=double(jj);
pxy.y=calculate(pxy.x,mm,nn);
Transform(pxy,pdraw);//坐标变换
if(jj==0)
{
pDC->MoveTo(int(pdraw.x),int(pdraw.y));
}
pDC->LineTo(int(pdraw.x),int(pdraw.y));
}
}
///////////////////////////////////////////////////////////
m_pointEnd.x=pointDragged.x;
m_pointEnd.y=pointDragged.y;
DPtoVPf(m_pointEnd,pntEnd);//把最终实际坐标变换为用于显示的逻辑坐标
Transform1(pntEnd,pntt);
mm=pntt.x;
nn=pntt.y;
if(mm>0)
{
for(int jj=0;jj<=mm;jj++)
{
pxy.x=double(jj);
pxy.y=calculate(pxy.x,mm,nn);
Transform(pxy,pdraw);//坐标变换
if(jj==0)
{
pDC->MoveTo(int(pdraw.x),int(pdraw.y));
}
pDC->LineTo(int(pdraw.x),int(pdraw.y));
}
}
else
{
for(int jj=0;jj>=mm;jj--)
{
pxy.x=double(jj);
pxy.y=calculate(pxy.x,mm,nn);
Transform(pxy,pdraw);//坐标变换
if(jj==0)
{
pDC->MoveTo(int(pdraw.x),int(pdraw.y));
}
pDC->LineTo(int(pdraw.x),int(pdraw.y));
}
}
pDC->SelectObject(pOldPen);
}
void CPaintScp::DrawSelected(CDC* pDC, void* pTemp)
{
pDC->SetROP2(R2_COPYPEN);
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);
Draw(pDC);
if(m_bSelectStartNode)//TRUE表示图形元素起点被选中
{
m_bSelectStartNode=FALSE;
pDC->Ellipse(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
}
else if(m_bSelectEndNode)//TRUE表示图形元素终点被选中
{
m_bSelectEndNode=FALSE;
pDC->Ellipse(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
}
else if(!m_bReferencePoint)//参考点FALSE表示终点为参考点
{
DrawErase(pDC, (CPaintobjView*)pTemp);//擦除图形
pDC->Rectangle(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
pDC->Ellipse(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
}
else
{
DrawErase(pDC, (CPaintobjView*)pTemp);//擦除图形
pDC->Rectangle(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
pDC->Ellipse(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
}
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CPaintScp::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);
Draw(pDC);
//起点状态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=断点
if(m_uEndNodeState==2)//断点
{
pDC->MoveTo(m_pointEnd1.x-3,m_pointEnd1.y-3);
pDC->LineTo(m_pointEnd1.x+4,m_pointEnd1.y+4);
pDC->MoveTo(m_pointEnd1.x-3,m_pointEnd1.y+3);
pDC->LineTo(m_pointEnd1.x+4,m_pointEnd1.y-4);
}
else if(m_uEndNodeState==1)//非相切点
{
pDC->Rectangle(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
}
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CPaintScp::DrawErase1(CDC* pDC, void* pTemp)//擦除图形WHITE_BRUSHHOLLOW_BRUSH
{
CPoint pointPrimary;
CPoint pointEnd;
CPoint p11,p12,p21,p22;
DPtoVP(m_pointPrimary,pointPrimary);
DPtoVP(m_pointEnd,pointEnd);//把最终实际坐标变换为用于显示的逻辑坐标
p11.x=pointPrimary.x-4;
p11.y=pointPrimary.y-4;
p12.x=pointPrimary.x+4;
p12.y=pointPrimary.y+4;
p21.x=pointEnd.x-4;
p21.y=pointEnd.y-4;
p22.x=pointEnd.x+4;
p22.y=pointEnd.y+4;
pDC->LPtoDP(&p11);
pDC->LPtoDP(&p12);
pDC->LPtoDP(&p21);
pDC->LPtoDP(&p22);
CRect rect1(p11.x,p11.y,p12.x,p12.y);
CRect rect2(p21.x,p21.y,p22.x,p22.y);
((CPaintobjView*)pTemp)->InvalidateRect(&rect1);
((CPaintobjView*)pTemp)->InvalidateRect(&rect2);
}
void CPaintScp::DrawErase(CDC* pDC, void* pTemp)//擦除图形WHITE_BRUSHHOLLOW_BRUSH
{
pDC->SetROP2(R2_COPYPEN);
CPen* pOldPen;
CPen pDrawPen;
CBrush* pOldBrush;
pOldBrush = (CBrush *) pDC->SelectStockObject(HOLLOW_BRUSH);
CPoint m_pointPrimary1;
CPoint m_pointEnd1;
DPtoVP(m_pointPrimary,m_pointPrimary1);
DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
pDrawPen.CreatePen(PS_SOLID, m_nWidth, RGB(255,255,255));
pOldPen = pDC->SelectObject(&pDrawPen);
pDC->Rectangle(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
pDC->Rectangle(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
pDC->Ellipse(m_pointPrimary1.x-4,m_pointPrimary1.y-4,m_pointPrimary1.x+4,m_pointPrimary1.y+4);
pDC->Ellipse(m_pointEnd1.x-4,m_pointEnd1.y-4,m_pointEnd1.x+4,m_pointEnd1.y+4);
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldBrush);
}
void CPaintScp::OnDown(CPnt& pointDown)
{
m_pointEnd.x = m_pointPrimary.x = pointDown.x;
m_pointEnd.y = m_pointPrimary.y = pointDown.y;
}
void CPaintScp::OnDown2(CPnt& pointDown)
{
}
void CPaintScp::OnUp(CPnt& pointUp, CWnd* pWnd)
{
CClientDC DrawDC(pWnd);
Draw(&DrawDC);
}
void CPaintScp::onup1(CPnt& point1, CPnt& point2,CPnt& point3, CWnd *pWnd)
{ m_pointPrimary=point1;
m_pointEnd=point2;
}
CPnt CPaintScp::returnattr1()
{
return m_pointPrimary;
}
CPnt CPaintScp::returnattr2()
{
return m_pointEnd;
}
//得到路径的绘制起点
//pnt1 为传递的鼠标点坐标或给定的起点坐标,
//id为返回点的ID,
//pnt为返回点的坐标,angle为返回点的姿态角
//return FALSE表示无就近点
//return TRUE表示有就近点
BOOL CPaintScp::GetPathStartnode1(CPnt& pnt1,UINT& id,CPnt& pnt,double& angle)
{
BOOL forreturn=FALSE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -