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

📄 square.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// square.cpp : implementation of the CPaintSquare and CPaintRect classes
//

#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 "square.h"
#include "FillColorStatic.h"
#include "RectAttrDlg.h"
#include "DeviceRectAttrDlg.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);
/////////////////////////////////////////////////////////////////////////////
/*
// CPaintSquare
//IMPLEMENT_SERIAL(CPaintRect, CPainted, VERSIONABLE_SCHEMA)
IMPLEMENT_SERIAL(CPaintSquare, CPainted, VERSIONABLE_SCHEMA)

CPaintSquare::CPaintSquare(BOOL bFilled)
{
	m_bFilled = bFilled;
	m_rgbInside = RGB(127, 127, 127);
}

void CPaintSquare::Draw(CDC* pDC)
{
	CPen*	pOldPen;
	CPen	pDrawPen;
	CBrush 	DrawBrush;
	CBrush* pOldBrush;

	if (m_bFilled)
	{
		DrawBrush.CreateSolidBrush(m_rgbInside);
		pOldBrush = pDC->SelectObject(&DrawBrush);
	}
	else
	{
		pOldBrush = (CBrush*) pDC->SelectStockObject(HOLLOW_BRUSH);
	}

	pDrawPen.CreatePen(PS_SOLID, int(fscale*m_nWidth), m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	CPoint m_pointPrimary1;
	CPoint m_pointLower1;

	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointLower,m_pointLower1);//把最终实际坐标变换为用于显示的逻辑坐标
	pDC->Rectangle(m_pointPrimary1.x,m_pointPrimary1.y,m_pointLower1.x,m_pointLower1.y);

	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
}

void CPaintSquare::MoveDraw(CDC* pDC, CPnt& p1,CPnt& p2)
{
}
void CPaintSquare::DragDraw(CDC* pDC, CPnt& pointDragged)
{
	pDC->SetROP2(R2_NOT);
	
	CPen*	pOldPen;
	CPen	DrawPen;

	DrawPen.CreatePen(PS_SOLID, int(fscale*m_nWidth), m_rgbPrimary);
	pOldPen = pDC->SelectObject(&DrawPen);

	CPoint m_pointPrimary1;
	CPoint m_pointLower1;

	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointLower,m_pointLower1);//把最终实际坐标变换为用于显示的逻辑坐标
	
	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointPrimary1.x,m_pointLower1.y);
	pDC->LineTo(m_pointLower1.x,m_pointLower1.y);
	pDC->LineTo(m_pointLower1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointPrimary1.x,m_pointPrimary1.y);
	
	m_pointLower.x = m_pointPrimary.x;
	m_pointLower.y = m_pointPrimary.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->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointPrimary1.x,m_pointLower1.y);
	pDC->LineTo(m_pointLower1.x,m_pointLower1.y);
	pDC->LineTo(m_pointLower1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointPrimary1.x,m_pointPrimary1.y);

	pDC->SelectObject(pOldPen);
}

void CPaintSquare::DrawSelected(CDC* pDC)
{
	CPen*	pOldPen;
	CPen	pDrawPen;
	CBrush 	DrawBrush;
	CBrush* pOldBrush;

	DrawBrush.CreateHatchBrush(HS_FDIAGONAL, 0);
	pOldBrush = pDC->SelectObject(&DrawBrush);

	pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);

	CPoint m_pointPrimary1;
	CPoint m_pointLower1;

	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointLower,m_pointLower1);//把最终实际坐标变换为用于显示的逻辑坐标
	pDC->Rectangle(m_pointPrimary1.x,m_pointPrimary1.y,m_pointLower1.x,m_pointLower1.y);

	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
}

void CPaintSquare::OnDown(CPnt& pointDown)
{
//	m_pointLower = m_pointPrimary = pointDown;
	m_pointLower.x = m_pointPrimary.x = pointDown.x;
	m_pointLower.y = m_pointPrimary.y = pointDown.y;
}
void CPaintSquare::OnDown2(CPnt& pointDown)
{

}
void CPaintSquare::OnUp(CPnt& pointUp, CWnd* pWnd)
{
	NormalizePoints(m_pointPrimary, m_pointLower);

	CClientDC DrawDC(pWnd);
	Draw(&DrawDC);
}
void CPaintSquare::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 CPaintSquare::returnattr1()
{
	
return m_pointPrimary;	
}
CPnt CPaintSquare::returnattr2()
{
return m_pointLower;	

}
//得到路径的绘制起点
int CPaintSquare::GetPathStartnode(CPnt& pnt1, CPnt& pnt2)
{
	return	1;
}
//得到路径的绘制终点
BOOL CPaintSquare::GetPathEndnode(CPnt& pnt1)
{
	return	1;
}

void CPaintSquare::GetBoundingRect(double &minx,double &miny,double &maxx,double &maxy)
{
//	pRect->top = UINT (scale*m_pointPrimary.y);
//	pRect->left = UINT (scale*m_pointPrimary.x);
//	pRect->bottom = UINT (scale*m_pointLower.y);
//	pRect->right = UINT (scale*m_pointLower.x);
}

BOOL CPaintSquare::IsHit(CPnt& pointBang)
{
	CRect rect((UINT)m_pointPrimary.x, (UINT)m_pointPrimary.y, (UINT)m_pointLower.x, (UINT)m_pointLower.y);
	CPoint pointBang1;
	pointBang1.x=(UINT) pointBang.x;
	pointBang1.y=(UINT) pointBang.y;
	if(rect.PtInRect(pointBang1))
	m_bhitarc=FALSE;//TRUE表示正圆弧被选中
	return rect.PtInRect(pointBang1);
}


void CPaintSquare::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;
	}

}
*/

/////////////////////////////////////////////////////////////////////////////
// CPaintRect

IMPLEMENT_SERIAL(CPaintRect, CObject, VERSIONABLE_SCHEMA)

CPaintRect::CPaintRect()
{
	m_bFilled=TRUE;
	m_rgbInside=RGB(125,125,125);
}
CPaintRect::~CPaintRect()
{
}
void CPaintRect::Draw(CDC* pDC)
{
	CPen*	pOldPen;
	CPen	pDrawPen;
	CBrush 	DrawBrush;
	CBrush* pOldBrush;
	if (m_bFilled)
	{
		DrawBrush.CreateSolidBrush(m_rgbInside);
		pOldBrush = pDC->SelectObject(&DrawBrush);
	}
	else
	{
		pOldBrush = (CBrush*) pDC->SelectStockObject(WHITE_BRUSH);
	}
	pDrawPen.CreatePen(PS_SOLID, m_nWidth, m_rgbPrimary);
	pOldPen = pDC->SelectObject(&pDrawPen);	
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
	DPtoVP(m_pointPrimary,m_pointPrimary1);
	DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
	pDC->Rectangle(m_pointPrimary1.x,m_pointPrimary1.y,m_pointEnd1.x,m_pointEnd1.y);
	pDC->SelectObject(pOldBrush);
	pDC->SelectObject(pOldPen);
}

void CPaintRect::DragDraw(CDC* pDC, CPnt& pointDragged)
{
	pDC->SetROP2(R2_NOT);	
	CPen*	pOldPen;
	CPen	pDrawPen;
	CPoint m_pointPrimary1;
	CPoint m_pointEnd1;
	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->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointPrimary1.x,m_pointEnd1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointPrimary1.x,m_pointPrimary1.y);
	m_pointEnd.x = pointDragged.x;
	m_pointEnd.y = pointDragged.y;
	
	DPtoVP(m_pointEnd,m_pointEnd1);//把最终实际坐标变换为用于显示的逻辑坐标
	pDC->MoveTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointPrimary1.x,m_pointEnd1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointEnd1.y);
	pDC->LineTo(m_pointEnd1.x,m_pointPrimary1.y);
	pDC->LineTo(m_pointPrimary1.x,m_pointPrimary1.y);
	pDC->SelectObject(pOldPen);
}



void CPaintRect::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 CPaintRect::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->Rectangle(m_pointPrimary1.x, m_pointPrimary1.y,
 			m_pointEnd1.x,m_pointEnd1.y);
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}
/*
void CPaintRect::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=断点
	if(m_uEndNodeState==2)//断点

⌨️ 快捷键说明

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