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

📄 paintvw.cpp

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

#include "stdafx.h"
#include "const.h"
#include "painted.h"
#include "paintobj.h"
#include "mainfrm.h"
#include "paintdoc.h"
#include "line.h"

#include "SearchPath.h"
#include "SearchNode.h"
#include "paintvw.h"
#include "Lineattr.h"
#include "Arcattr.h"
#include "Setscale.h"
#include "math.h"
#include "Nodeattr.h"
#include "ChangeAngle.h"
#include "InputOrigin.h"
#include "circle.h"
#include "PaintLazys.h"
#include "PaintChord.h"
#include "PaintPie.h"
#include "PaintPolygon.h"
#include "PaintRoundrect.h"
#include "PaintScp.h"
#include "PaintSide.h"
#include "square.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
extern int m_wscreen;//客户区宽度(逻辑坐标)
extern int m_hscreen;//客户区高度(逻辑坐标)
extern double m_xstart;
extern double m_ystart;
extern double fxmin;
extern double fymin;
extern double fxmax;
extern double fymax;
extern double fscale;
extern double fbasicscale;
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);
extern double PointToLine(double xx,double yy,double x1,double y1,double x2,double y2);
extern double PointToLine1(CPnt p1,CPnt p2,CPnt p3,CPnt p4,BOOL bbb);
extern BOOL AngleJudge(double angle1,double angle2);
/////////////////////////////////////////////////////////////////////////////
// CPaintobjView

IMPLEMENT_DYNCREATE(CPaintobjView, CScrollView)

BEGIN_MESSAGE_MAP(CPaintobjView, CScrollView)
	//{{AFX_MSG_MAP(CPaintobjView)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_VIEW_SCROLL, OnViewScroll)
	ON_UPDATE_COMMAND_UI(ID_VIEW_SCROLL, OnUpdateViewScroll)
	ON_UPDATE_COMMAND_UI(ID_VIEW_ZOOMFIT, OnUpdateViewZoomfit)
	ON_COMMAND(ID_VIEW_ZOOMFIT, OnViewZoomfit)
	ON_UPDATE_COMMAND_UI(ID_EDIT_COPY, OnUpdateEditCopy)
	ON_UPDATE_COMMAND_UI(ID_EDIT_CUT, OnUpdateEditCut)
	ON_COMMAND(ID_EDIT_CUT, OnEditCut)
	ON_WM_RBUTTONDOWN()
	ON_WM_LBUTTONDBLCLK()
	ON_WM_SIZE()
	ON_COMMAND(ID_OPTION_SETORIGIN, OnOptionSetorigin)
	ON_COMMAND(ID_OPTION_SETSCALE, OnOptionSetscale)
	ON_WM_ERASEBKGND()
	ON_COMMAND(ID_VIEW_REVERT, OnViewRevert)
	ON_WM_KEYDOWN()
	ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
	ON_UPDATE_COMMAND_UI(ID_EDIT_PASTE, OnUpdateEditPaste)
	ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
	ON_UPDATE_COMMAND_UI(ID_VIEW_REVERT, OnUpdateViewRevert)
	ON_COMMAND(ID_OPTION_NODESTATE, OnOptionNodestate)
	ON_UPDATE_COMMAND_UI(ID_OPTION_NODESTATE, OnUpdateOptionNodestate)
	ON_COMMAND(ID_TOOL_JOINTWOLINES, OnToolJointwolines)
	ON_UPDATE_COMMAND_UI(ID_TOOL_JOINTWOLINES, OnUpdateToolJointwolines)
	ON_EN_CHANGE(IDC_ANGLE, OnChangeAngle)
	ON_BN_CLICKED(IDC_CHECKED, OnChecked)
	ON_EN_CHANGE(IDC_LENGTH, OnChangeLength)
	ON_COMMAND(ID_SELECT_ANGLELENGTH, OnSelectAnglelength)
	ON_CBN_SELCHANGE(IDC_COMBO1, OnSelchangeCombo1)
	ON_UPDATE_COMMAND_UI(ID_SELECT_ANGLELENGTH, OnUpdateSelectAnglelength)
	ON_COMMAND(ID_OPTION_NODESORT, OnOptionNodesort)
	ON_COMMAND(ID_EDIT_SEARCHPATH, OnEditSearchpath)
	ON_COMMAND(ID_EDIT_SEARCHNODE, OnEditSearchnode)
	ON_COMMAND(ID_OPTION_INPUTORIGIN, OnOptionInputorigin)
	ON_COMMAND(ID_TOOL_BUILDING_JOINTWOLINES, OnToolBuildingJointwolines)
	ON_UPDATE_COMMAND_UI(ID_TOOL_BUILDING_JOINTWOLINES, OnUpdateToolBuildingJointwolines)
	ON_COMMAND(ID_TOOL_DEVICE_JOINTWOLINES, OnToolDeviceJointwolines)
	ON_UPDATE_COMMAND_UI(ID_TOOL_DEVICE_JOINTWOLINES, OnUpdateToolDeviceJointwolines)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPaintobjView construction/destruction

CPaintobjView::CPaintobjView()
{
	CWinApp* pApp = AfxGetApp();
	m_bZoomMode = FALSE;
	m_bSetorigin= FALSE;//设置原点
	m_bTracking = FALSE;
	m_pSearchPath = NULL;
	m_pSearchNode = NULL;
	m_hcurArrow = pApp->LoadStandardCursor(IDC_ARROW);
	m_hcurCross = pApp->LoadStandardCursor(IDC_CROSS);

	m_hcurMove= pApp->LoadCursor(IDC_CURSORMOVE);//移动光标句柄
	m_hcurZoomin= pApp->LoadCursor(IDC_CURSORZOOMIN);//缩小光标句柄
	m_hcurZoomout= pApp->LoadCursor( IDC_CURSORZOOMOUT);//放大光标句柄
	m_hcurSetorigin= pApp->LoadCursor( IDC_CURSORSETORIGIN);//设置原点光标句柄
	m_hcurChange= pApp->LoadCursor( IDC_CURSORCHANGE);//端点重合时光标句柄
	m_hcurNodeattr= pApp->LoadCursor( IDC_CURSORNODEATTR);//编辑节点光标句柄
	m_npushnumber=0;
	ASSERT(m_hcurArrow != NULL);
	ASSERT(m_hcurCross != NULL);
	
	// Win95 has IDC_SIZEALL, WinNT 3.51 has IDC_SIZE
//	m_hcurSize = pApp->LoadStandardCursor(IDC_SIZEALL);
//	if (m_hcurSize == NULL)
//		pApp->LoadStandardCursor(IDC_SIZE);
//	ASSERT(m_hcurSize != NULL);
}

CPaintobjView::~CPaintobjView()
{
}

/////////////////////////////////////////////////////////////////////////////
// CPaintobjView drawing

void CPaintobjView::OnDraw(CDC* pDC)
{	
	CPaintobjDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if(pDoc->m_bDisNodeState)//显示节点自检结果
	{	
		int nShapes = pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{
			CPainted* pPainter =(CPainted*) pDoc->GetShape(index);
			if(pPainter->m_uObjectType==0)//如果是路径则进行节点状态显示
			{
				pPainter->DrawSpecialNode(pDC);
			}
			else//如果不是路径则不进行节点状态显示
			{
				pPainter->Draw(pDC);
			}			
		}
	}
	else
	{	
		int nShapes = pDoc->NumShapes();
	    for (int index = 0; index < nShapes; index++)
		{
			CPainted* pPainter =(CPainted*) pDoc->GetShape(index);
			if(pPainter->m_bSelect)
				pPainter->DrawSelected(pDC,this);			
			else 
				pPainter->Draw(pDC);	
		 }
	}
}

/////////////////////////////////////////////////////////////////////////////
// CPaintobjView printing

BOOL CPaintobjView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	CRect rect;
	rect.left=0;
	rect.top=0;
	rect.bottom=600;
	rect.right=800;
	pInfo->m_rectDraw=rect;
	return DoPreparePrinting(pInfo);
}

void CPaintobjView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CPaintobjView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CPaintobjView diagnostics

#ifdef _DEBUG
void CPaintobjView::AssertValid() const
{
	CScrollView::AssertValid();
}

void CPaintobjView::Dump(CDumpContext& dc) const
{
	CScrollView::Dump(dc);
}

CPaintobjDoc* CPaintobjView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPaintobjDoc)));
	return (CPaintobjDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CPaintobjView message handlers

void CPaintobjView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
	ASSERT(pDoc != NULL);
	CClientDC ClientDC(this);
	OnPrepareDC(&ClientDC);
	ClientDC.DPtoLP(&point);
	CPnt pnt;
	VPtoDP(point,pnt);//从鼠标得到的逻辑坐标变换为用于保存的最终实际坐标
	if (pDoc->m_pSelectedTool == NULL)
	{	
		if(m_bSetorigin)
		{
		::SetCursor(m_hcurSetorigin);
		}
		else if(pDoc->m_bMove)//移动图形
		{
		::SetCursor(m_hcurMove);
		}
		else if(pDoc->m_bZoomIn)
		{
		::SetCursor(m_hcurZoomin);
		}
		else if(pDoc->m_bZoomOut)
		{
		::SetCursor(m_hcurZoomout);
		}		
		else
		::SetCursor(m_hcurArrow);		
	}
	if(pDoc->m_bpaintLine)
	{
		SetCapture();
		m_bTracking = TRUE;
		CPnt pntt;
		double angle;
		UINT id;
		if(pDoc->m_PathPaintMode==1||pDoc->m_PathPaintMode==2)//路径的绘制模式
		{
			pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
		}
		((CPaintLine*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL yy=((CPaintLine*) pDoc->m_pSelectedTool)->GetPathStartnode1(pnt,id,pntt,angle);
		if(yy==FALSE)//return FALSE表示无就近点
		{
			pDoc->m_uCurStartnodeId=pDoc->m_uCurNodeIdMax;			
			pDoc->m_bStartnodeIndep=TRUE;//表示起点是否独立TRUE==独立
		}
		else //return TRUE表示有就近点
		{	
			pDoc->m_uCurStartnodeId=id;
			pDoc->m_pSelectedTool->m_uStartNodeId=id;
			pDoc->m_pSelectedTool->m_StartPostureAngle=angle;
			pDoc->m_bStartnodeIndep=FALSE;//表示起点是否独立TRUE==独立
			pnt=pntt;
		}		
		pDoc->m_pSelectedTool->OnDown(pnt);
	}

	else if(pDoc->m_bpaintarc)
	{
		if(m_npushnumber==0)
		{
			SetCapture();
			CPnt pntt;
			double angle;
			UINT id;
			if(pDoc->m_PathPaintMode==6||pDoc->m_PathPaintMode==7||pDoc->m_PathPaintMode==10||pDoc->m_PathPaintMode==11)//路径的绘制模式
			{
				pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
			}
			((CPaintArc*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;//
			BOOL yy=((CPaintArc*) pDoc->m_pSelectedTool)->GetPathStartnode1(pnt,id,pntt,angle);
			if(yy==FALSE)//return FALSE表示无就近点
			{	
				pDoc->m_uCurStartnodeId=pDoc->m_uCurNodeIdMax;			
				pDoc->m_bStartnodeIndep=TRUE;//表示起点是否独立TRUE==独立
			}
			else //return TRUE表示有就近点
			{	
				pDoc->m_uCurStartnodeId=id;
				pDoc->m_pSelectedTool->m_uStartNodeId=id;
				pDoc->m_pSelectedTool->m_StartPostureAngle=angle;
				pDoc->m_bStartnodeIndep=FALSE;//表示起点是否独立TRUE==独立
				pnt=pntt;				
			}			
			pDoc->m_pSelectedTool->OnDown(pnt);
			m_npushnumber++;
		}
		else if(m_npushnumber==1)
		{
			int aa;				
			aa=((CPaintArc*) pDoc->m_pSelectedTool)->GetArcCirclecenter1(pnt,pDoc);
			pDoc->m_pSelectedTool->OnDown2(pnt);
			
			((CPaintArc*) pDoc->m_pSelectedTool)->DragDrawCircle(&ClientDC,pnt,pDoc);
			m_npushnumber++;
		}
		else if(m_npushnumber==2)
		{			
			m_bTracking = TRUE;
			BOOL eee;
			((CPaintArc*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
			eee=((CPaintArc*) pDoc->m_pSelectedTool)->GetPathEndnode1(pnt);
			pDoc->m_bEndnodeIndep=!eee;//TRUE==独立		
			pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		}
	}
	else if(pDoc->m_bpaintChord)//TRUE表示正在画弦
	{
		if(m_npushnumber==0)
		{
			SetCapture();
			CPnt pnt2;
			((CPaintChord*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
			((CPaintChord*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
			pDoc->m_pSelectedTool->OnDown(pnt);
			m_npushnumber++;
		}
		else if(m_npushnumber==1)
		{
			((CPaintChord*) pDoc->m_pSelectedTool)->GetChordCirclecenter(pnt,pDoc);
			pDoc->m_pSelectedTool->OnDown2(pnt);
			m_npushnumber++;
		}
		else if(m_npushnumber==2)
		{			
			m_bTracking = TRUE;
			((CPaintChord*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
			((CPaintChord*) pDoc->m_pSelectedTool)->GetPathEndnode(pnt);
			pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		}
	}
	else if(pDoc->m_bpaintEllipse)//TRUE表示正在画椭圆
	{
		SetCapture();
		m_bTracking = TRUE;
		CPnt pnt2;
		((CPaintEllipse*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		((CPaintEllipse*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
		pDoc->m_pSelectedTool->OnDown(pnt);
	}
	else if(pDoc->m_bpaintLazys)//TRUE表示正在画懒-S
	{
		SetCapture();
		m_bTracking = TRUE;
		CPnt pntt;
		double angle=0;
		UINT id;
		if(pDoc->m_LazysPaintMode==1||pDoc->m_LazysPaintMode==2)//路径的绘制模式
		{
			pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
		}
		((CPaintLazys*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL yy=((CPaintLazys*) pDoc->m_pSelectedTool)->GetPathStartnode1(pnt,id,pntt,angle);
		if(yy==FALSE)//return FALSE表示无就近点
		{
			pDoc->m_uCurStartnodeId=pDoc->m_uCurNodeIdMax;			
			pDoc->m_bStartnodeIndep=TRUE;//表示起点是否独立TRUE==独立
		}
		else //return TRUE表示有就近点
		{	
			pDoc->m_uCurStartnodeId=id;
			pDoc->m_pSelectedTool->m_uStartNodeId=id;
			pDoc->m_pSelectedTool->m_StartPostureAngle=angle;
			pDoc->m_bStartnodeIndep=FALSE;//表示起点是否独立TRUE==独立
			pnt=pntt;
		}	
		if(pDoc->m_bGetangleMode)//FALSE表示自动取角
		{
			((CPaintLazys*) pDoc->m_pSelectedTool)->m_angStart=pDoc->m_dPaintAngle*pi/180.0;// 起点的倾斜角(世界坐标系中)
		}
		else
		{
			((CPaintLazys*) pDoc->m_pSelectedTool)->m_angStart=angle;// 起点的倾斜角(世界坐标系中)	
		}
		pDoc->m_pSelectedTool->OnDown(pnt);
	}
	else if(pDoc->m_bpaintPie)//TRUE表示正在画扇形
	{
		if(m_npushnumber==0)
		{
			SetCapture();
			CPnt pnt2;
			((CPaintPie*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
			((CPaintPie*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
			pDoc->m_pSelectedTool->OnDown(pnt);
			m_npushnumber++;
		}
		else if(m_npushnumber==1)
		{
			((CPaintPie*) pDoc->m_pSelectedTool)->GetPieCirclecenter(pnt,pDoc);
			pDoc->m_pSelectedTool->OnDown2(pnt);
			m_npushnumber++;
		}
		else if(m_npushnumber==2)
		{			
			m_bTracking = TRUE;
			((CPaintPie*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
			((CPaintPie*) pDoc->m_pSelectedTool)->GetPathEndnode(pnt);
			pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		}
	}
	else if(pDoc->m_bpaintPolygon)//TRUE表示正在画多边形
	{
		if(pDoc->m_PolygonPaintMode==0)//鼠标拖拽画法
		{			
			m_bTracking = TRUE;
			pDoc->PointXY[m_npushnumber].x=pnt.x;

⌨️ 快捷键说明

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