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

📄 paintside.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// PaintSide.cpp: implementation of the CPaintSide class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "const.h"
#include "paintobj.h"
#include "painted.h"
#include "paintdoc.h"
#include "PaintSide.h"
#include "math.h"
#include "SearchPath.h"
#include "SearchNode.h"
#include "paintvw.h"
#include "SideAttrDlg.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern double fscale;

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);
extern double Distancef(double x1, double y1, double x2, double y2);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_SERIAL(CPaintSide, CObject, VERSIONABLE_SCHEMA)
CPaintSide::CPaintSide()
{

}

CPaintSide::~CPaintSide()
{

}

void CPaintSide::Draw(CDC* pDC)
{
	//pDC->SetROP2(R2_NOT);
	pDC->SetROP2(R2_COPYPEN);
	CPen*	pOldPen;
	CPen	pDrawPen;

	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;

	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
	//pDrawPen.CreatePen(PS_DOT, int(fscale*m_nWidth)>2? 1:1, m_rgbPrimary);
	pDrawPen.CreatePen(PS_SOLID, int(fscale*m_nWidth)>2? 1:1, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);

	pDC->SelectObject(pOldPen);
}

void CPaintSide::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 CPaintSide::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 CPaintSide::DragDraw(CDC* pDC, CPnt& pointDragged)
{
	pDC->SetROP2(R2_NOT);//R2_XORPEN   R2_NOTMASKPEN 	
	CPen*	pOldPen;
	CPen	pDrawPen;
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
	CPoint m_pointDragged;

	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
	DPtoVP(pointDragged,m_pointDragged);

	pDrawPen.CreatePen(PS_DOT, 0, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);
	
	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointDragged.x,m_pointDragged.y);

	//double m_flength;//直线长度	
	m_flength=Distancef(m_pointPrimary.x,m_pointPrimary.y,pointDragged.x,pointDragged.y);
		
	m_pointEnd = pointDragged;
	pDC->SelectObject(pOldPen);
}

void CPaintSide::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 CPaintSide::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 CPaintSide::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 CPaintSide::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);
	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);	
	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 CPaintSide::OnDown(CPnt& pointDown)
{
	m_pointEnd.x = m_pointPrimary.x = pointDown.x;
	m_pointEnd.y = m_pointPrimary.y = pointDown.y;
}
void CPaintSide::OnDown2(CPnt& pointDown)
{

}
void CPaintSide::OnUp(CPnt& pointUp, CWnd* pWnd)
{ 	
	CClientDC DrawDC(pWnd);
	Draw(&DrawDC);
}
void CPaintSide::onup1(CPnt& point1, CPnt& point2,CPnt& point3, CWnd *pWnd)
{m_pointPrimary=point1;
	m_pointEnd=point2;
	NormalizePoints(m_pointPrimary,m_pointEnd);
	CClientDC tempDC(pWnd);
	Draw(&tempDC);
}
CPnt CPaintSide::returnattr1()
{
	return m_pointPrimary;	
}
CPnt CPaintSide::returnattr2()
{
	return m_pointEnd;
}
//得到路径的绘制起点
int CPaintSide::GetPathStartnode(CPnt& pnt1, CPnt& pnt2)
{
	return	1;
}

//得到路径的绘制起点
//pnt1 为传递的鼠标点坐标或给定的起点坐标,
//id为返回点的ID,
//pnt为返回点的坐标,angle为返回点的姿态角
//return FALSE表示无就近点
//return TRUE表示有就近点
BOOL CPaintSide::GetPathStartnode1(CPnt& pnt1,UINT& id,CPnt& pnt,double& angle)
{
	BOOL forreturn=FALSE;	
	CPainted*	pPainted;
	//若有一条参考线段并定义了参考点为其起点或终点
	if(m_pDoc->m_nGraphSelect==1 && m_pDoc->GraphSelect[0].Type>=0 && m_pDoc->GraphSelect[0].Type<=4)
	{
		pPainted =m_pDoc->GetShape(m_pDoc->GraphSelect[0].Index);
		if(!pPainted->m_bReferencePoint)//参考点为终点
		{	
			CPnt ppp;
			ppp=pPainted->returnattr2();
			pnt=ppp;			
			angle=pPainted->m_EndPostureAngle;
			id=pPainted->m_uEndNodeId;	
			forreturn=TRUE;							
		}
		else//参考点为起点
		{			
			CPnt ppp;
			ppp=pPainted->returnattr1();
			pnt=ppp;
			angle=pPainted->m_StartPostureAngle;
			id=pPainted->m_uStartNodeId;	
			forreturn=TRUE;
		}
	}
	else//若没有一条参考线段
	{
		int nShapes = m_pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{
			pPainted =(CPainted*) m_pDoc->GetShape(index);
			forreturn=pPainted->NearJudge2(pnt1,id,pnt,angle);
			if(forreturn)
				break;
		}
	}
	return forreturn;
}

//得到路径的绘制终点
//返回值==FALSE时表示终点独立(不与任何节点相连)
//返回值==TRUE时表示终点与某节点相连
//
BOOL CPaintSide::GetPathEndnode1(CPnt& pnt1)
{
	BOOL  forreturn=FALSE;
	CPainted*	pPainted;		
	if(m_pDoc->m_SidePaintMode==2)
	{
		pnt1=m_pDoc->m_pPaintEndNode;//绘图时给定的终点		
	}		
	int nShapes = m_pDoc->NumShapes();
	for (int index = 0; index < nShapes; index++)
	{
		UINT id;
		CPnt pnt;

⌨️ 快捷键说明

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