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

📄 paintvw.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		}
		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
		{
			CPainted*	pPainted;
			UINT bIsHit1=0;
			int nShapes = pDoc->NumShapes();
			for (int index = 0; index < nShapes; index++)
			{			
				pPainted =(CPainted*) pDoc->GetShape(index);
				bIsHit1=pPainted->IsHit1(pnt);
				if(bIsHit1)
					break;
			}
			if(bIsHit1)
			{
				bIsHit1=0;
				::SetCursor(m_hcurNodeattr);
			}
			else			
				::SetCursor(m_hcurArrow);			
		}		
	}
	else
	{
		CPainted*	pPainted;
		UINT bIsHit1=0;
		int nShapes = pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{			
			pPainted =(CPainted*) pDoc->GetShape(index);
			bIsHit1=pPainted->IsHit1(pnt);
			if(bIsHit1)
				break;
		}
		if(bIsHit1)
		{	
			bIsHit1=0;
			::SetCursor(m_hcurChange);
		}
		else
			::SetCursor(m_hcurCross);
	}
	
	if(pDoc->m_bMove1)//移动图形
	{
		double minx,miny;
		double minx1,miny1;
		CRect rect;
		minx=pnt.x-pDoc->m_pStartMove.x;
		miny=pnt.y-pDoc->m_pStartMove.y;		
		for(int i=0;i<pDoc->m_nGraphSelect;i++)
		{
			CPainted*	pPainted;
			pPainted =pDoc->GetShape(pDoc->GraphSelect[i].Index);
			pPainted->Move(minx,miny);//移动图形元素 
			pPainted->MoveDraw(&ClientDC,pPainted->returnattr1(),pPainted->returnattr2());
		}		
		pDoc->m_pStartMove=pnt;
		CRect rect4;
		pDoc->ExpandBounds(&rect4);
		CSize siz;
		pDoc->GetBounds(&siz);
		//SetScrollSizes(MM_TEXT, siz);
		
		//以下程序判断选中的图形是否与未选中的图形有相连的节点
		//若有则使之为当前最大节点号顺序递增
		int nShapes = pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{		
			CPainted*	pPainted;
			pPainted =pDoc->GetShape(index);
			if(!pPainted->m_bSelect)
			{				
				UINT id1=pPainted->m_uStartNodeId;
				UINT id2=pPainted->m_uEndNodeId;
				BOOL flag1=FALSE;
				BOOL flag2=FALSE;
				//如果选中的图形与未选中的某图形起点相连
				for(int i=0;i<pDoc->m_nGraphSelect;i++)
				{							
					CPainted* ppp;										
					ppp =pDoc->GetShape(pDoc->GraphSelect[i].Index);
					UINT idd1=ppp->m_uStartNodeId;
					UINT idd2=ppp->m_uEndNodeId;					
					if(idd1==id1)
					{
						ppp->m_uStartNodeId=pDoc->m_uCurNodeIdMax;
						flag1=TRUE;
					}
					else if(idd2==id1)
					{
						ppp->m_uEndNodeId=pDoc->m_uCurNodeIdMax;
						flag1=TRUE;
					}
				}
				if(flag1)
				{
					flag1=FALSE;
					pDoc->m_uCurNodeIdMax++;
				}
				//如果选中的图形与未选中的某图形终点相连
				for(i=0;i<pDoc->m_nGraphSelect;i++)
				{							
					CPainted* ppp;										
					ppp =pDoc->GetShape(pDoc->GraphSelect[i].Index);
					UINT idd1=ppp->m_uStartNodeId;
					UINT idd2=ppp->m_uEndNodeId;					
					if(idd1==id2)
					{
						ppp->m_uStartNodeId=pDoc->m_uCurNodeIdMax;
						flag2=TRUE;
					}
					else if(idd2==id2)
					{
						ppp->m_uEndNodeId=pDoc->m_uCurNodeIdMax;
						flag2=TRUE;
					}
				}
				if(flag2)
				{
					flag2=FALSE;
					pDoc->m_uCurNodeIdMax++;
				}

			}
		}
		/////////////////////////////////////////////////////
		BOOL endloop=FALSE;
		int nShapes1 = pDoc->NumShapes();
		for (int index1 = 0; index1 < nShapes1; index1++)
		{	
			 CPainted*	pPainted;
			 pPainted =pDoc->GetShape(index1);
			 if(!pPainted->m_bSelect)
			 {				
				UINT id1=pPainted->m_uStartNodeId;
				UINT id2=pPainted->m_uEndNodeId;				
				CPnt pointEnd;
				CPnt pointPrimary;
				CPoint pointEnd1;
				CPoint pointPrimary1;
				pointPrimary=pPainted->returnattr1();
				pointEnd=pPainted->returnattr2();
				DPtoVP(pointPrimary,pointPrimary1);
				DPtoVP(pointEnd,pointEnd1);
				for(int i=0;i<pDoc->m_nGraphSelect;i++)
				{						
					CPainted* ppp;
					CPnt End;
					CPnt Primary;
					CPoint End1;
					CPoint Primary1;					
					ppp =pDoc->GetShape(pDoc->GraphSelect[i].Index);
					Primary=ppp->returnattr1();
					End=ppp->returnattr2();
					DPtoVP(Primary,Primary1);
					DPtoVP(End,End1);
					if(Distance(Primary1.x,Primary1.y,pointPrimary1.x,pointPrimary1.y)<4)
					{	
						minx1=pointPrimary.x-Primary.x;
						miny1=pointPrimary.y-Primary.y;	
						ppp->m_uStartNodeId=id1;
						endloop=TRUE;						
					}
					else if(Distance(Primary1.x,Primary1.y,pointEnd1.x,pointEnd1.y)<4)
					{	
						minx1=pointEnd.x-Primary.x;
						miny1=pointEnd.y-Primary.y;	
						ppp->m_uStartNodeId=id2;
						endloop=TRUE;					
					}
					else if(Distance(End1.x,End1.y,pointPrimary1.x,pointPrimary1.y)<4)
					{	
						minx1=pointPrimary.x-End.x;
						miny1=pointPrimary.y-End.y;	
						ppp->m_uEndNodeId=id1;
						endloop=TRUE;						
					}
					else if(Distance(End1.x,End1.y,pointEnd1.x,pointEnd1.y)<4)
					{	
						minx1=pointEnd.x-End.x;
						miny1=pointEnd.y-End.y;	
						ppp->m_uEndNodeId=id2;
						endloop=TRUE;						
					}
				}
				
			 }	
		}
		if(endloop)
		{
			CPainted*	ppp;
			for(int i=0;i<pDoc->m_nGraphSelect;i++)
			{						
				ppp =pDoc->GetShape(pDoc->GraphSelect[i].Index);
				ppp->Move(minx1,miny1);//移动图形元素
				ppp->MoveDraw(&ClientDC,ppp->returnattr1(),ppp->returnattr2());
			}							
			endloop=FALSE;
			CRect rect;
			pDoc->ExpandBounds(&rect);
			CSize siz;
			pDoc->GetBounds(&siz);
			pDoc->GetNodeIdMax();					
		}
	}
	else if (pDoc->m_bpaintarc &&m_npushnumber==1)
	{	//实时动态显示圆心半径及圆弧所在的圆				
		int aa;	
		aa=((CPaintArc*) pDoc->m_pSelectedTool)->GetArcCirclecenter1(pnt,pDoc);
		((CPaintArc*) pDoc->m_pSelectedTool)->DragDrawCircle(&ClientDC,pnt,pDoc);
	}
	else if (pDoc->m_bpaintChord &&m_npushnumber==1)
	{	//实时动态显示圆心半径及圆弧所在的圆				
		int aa;
		aa=((CPaintChord*) pDoc->m_pSelectedTool)->GetChordCirclecenter(pnt,pDoc);
		((CPaintChord*) pDoc->m_pSelectedTool)->DragDrawCircle(&ClientDC,pnt,pDoc);
	}
	else if (pDoc->m_bpaintPie &&m_npushnumber==1)
	{	//实时动态显示圆心半径及圆弧所在的圆				
		int aa;		
		aa=((CPaintPie*) pDoc->m_pSelectedTool)->GetPieCirclecenter(pnt,pDoc);
		((CPaintPie*) pDoc->m_pSelectedTool)->DragDrawCircle(&ClientDC,pnt,pDoc);
	}
    else if (!m_bTracking)
		return;

	else if(pDoc->m_bpaintLine)
	{
		((CPaintLine*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL ccc;
		ccc=((CPaintLine*) pDoc->m_pSelectedTool)->GetPathEndnode1(pnt);
		
		pDoc->m_bEndnodeIndep=!ccc;//TRUE==独立
				
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		CPnt p1,p2;
		double angle,length;
		p1=pDoc->m_pSelectedTool->returnattr1();
		p2=pDoc->m_pSelectedTool->returnattr2();
		length=((CPaintLine *)pDoc->m_pSelectedTool)->m_flength;
		angle=((CPaintLine *)pDoc->m_pSelectedTool)->m_fangle;
		angle=angle*180.0/pi;
		CString str;		
		str.Format("起点(%.4f,%.4f)终点(%.4f,%.4f)长度(%.4f)角度(%.4f)",p1.x,p1.y,p2.x,p2.y,length,angle);
		p_Wnd->m_wndMyDialogBar.SetDlgItemText(IDC_EDIT1,str);
	}
	
	else if (pDoc->m_bpaintarc &&m_npushnumber==2)
	{	
		((CPaintArc*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL eee;
		eee=((CPaintArc*) pDoc->m_pSelectedTool)->GetPathEndnode1(pnt);
		pDoc->m_bEndnodeIndep=!eee;//TRUE==独立		
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		CPnt p1,p2,p3;
		double r,angle1,angle2;//起始弧度结束弧度					
		p1=pDoc->m_pSelectedTool->returnattr1();
		p2=pDoc->m_pSelectedTool->returnattr2();
		p3=pDoc->m_pSelectedTool->returncirclecenter();//返回圆心
		r=pDoc->m_pSelectedTool->returnradius();	//返回半径
		angle1=((CPaintArc *)pDoc->m_pSelectedTool)->m_Angle1;
		angle2=((CPaintArc *)pDoc->m_pSelectedTool)->m_Angle2;
		angle1=angle1*180.0/pi;
		angle2=angle2*180.0/pi;
		CString str;		
		str.Format("起点(%.4f,%.4f)终点(%.4f,%.4f)圆心(%.4f,%.4f)半径(%.4f)角度(%.4f,%.4f)",p1.x,p1.y,p2.x,p2.y,p3.x,p3.y,r,angle1,angle2);
		p_Wnd->m_wndMyDialogBar.SetDlgItemText(IDC_EDIT1,str);
	}
	else if (pDoc->m_bpaintChord &&m_npushnumber==2)//TRUE表示正在画弦
	{
		((CPaintChord*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL eee;
		eee=((CPaintChord*) pDoc->m_pSelectedTool)->GetPathEndnode(pnt);
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		CPnt p1,p2,p3;
		double r,angle1,angle2;//起始弧度结束弧度					
		p1=pDoc->m_pSelectedTool->returnattr1();
		p2=pDoc->m_pSelectedTool->returnattr2();
		p3=pDoc->m_pSelectedTool->returncirclecenter();//返回圆心
		r=pDoc->m_pSelectedTool->returnradius();	//返回半径
		angle1=((CPaintChord *)pDoc->m_pSelectedTool)->m_Angle1;
		angle2=((CPaintChord *)pDoc->m_pSelectedTool)->m_Angle2;
		angle1=angle1*180.0/pi;
		angle2=angle2*180.0/pi;
		CString str;		
		str.Format("起点(%.4f,%.4f)终点(%.4f,%.4f)圆心(%.4f,%.4f)半径(%.4f)角度(%.4f,%.4f)",p1.x,p1.y,p2.x,p2.y,p3.x,p3.y,r,angle1,angle2);
		p_Wnd->m_wndMyDialogBar.SetDlgItemText(IDC_EDIT1,str);
	
	  }
	
	else if (pDoc->m_bpaintPie &&m_npushnumber==2)//TRUE表示正在画扇形
	{
		((CPaintPie*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL eee;
		eee=((CPaintPie*) pDoc->m_pSelectedTool)->GetPathEndnode(pnt);
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		CPnt p1,p2,p3;
		double r,angle1,angle2;//起始弧度结束弧度					
		p1=pDoc->m_pSelectedTool->returnattr1();
		p2=pDoc->m_pSelectedTool->returnattr2();
		p3=pDoc->m_pSelectedTool->returncirclecenter();//返回圆心
		r=pDoc->m_pSelectedTool->returnradius();	//返回半径
		angle1=((CPaintPie *)pDoc->m_pSelectedTool)->m_Angle1;
		angle2=((CPaintPie *)pDoc->m_pSelectedTool)->m_Angle2;
		angle1=angle1*180.0/pi;
		angle2=angle2*180.0/pi;
		CString str;		
		str.Format("起点(%.4f,%.4f)终点(%.4f,%.4f)圆心(%.4f,%.4f)半径(%.4f)角度(%.4f,%.4f)",p1.x,p1.y,p2.x,p2.y,p3.x,p3.y,r,angle1,angle2);
		p_Wnd->m_wndMyDialogBar.SetDlgItemText(IDC_EDIT1,str);

	}
	else if(pDoc->m_bpaintEllipse)//TRUE表示正在画椭圆
	{
		((CPaintEllipse*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		((CPaintEllipse*) pDoc->m_pSelectedTool)->GetPathEndnode(pnt);
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
	}
	else if(pDoc->m_bpaintLazys)//TRUE表示正在画懒-S
	{
		((CPaintLazys*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL ccc;
		ccc=((CPaintLazys*) pDoc->m_pSelectedTool)->GetPathEndnode1(pnt);
		pDoc->m_bEndnodeIndep=!ccc;//TRUE==独立				
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		CPnt p1,p2;
		double angle;
		p1=pDoc->m_pSelectedTool->returnattr1();
		p2=pDoc->m_pSelectedTool->returnattr2();		
		angle=((CPaintLazys *)pDoc->m_pSelectedTool)->m_angStart;
		angle=angle*180.0/pi;
		CString str;		
		str.Format("起点(%.4f,%.4f)终点(%.4f,%.4f)起点的倾斜角(%.4f)",p1.x,p1.y,p2.x,p2.y,angle);
		p_Wnd->m_wndMyDialogBar.SetDlgItemText(IDC_EDIT1,str);
	}
	
	else if(pDoc->m_bpaintPolygon)//TRUE表示正在画多边形
	{
		if(pDoc->m_PolygonPaintMode==0)//鼠标拖拽画法	
			pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
	}
	else if(pDoc->m_bpaintRect)	//TRUE表示正在画矩形
	{
		((CPaintRect*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		((CPaintRect*) pDoc->m_pSelectedTool)->GetPathEndnode(pnt);
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
	}
	else if(pDoc->m_bpaintRoundrect)//TRUE表示正在画圆角矩形
	{
		((CPaintRoundrect*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		((CPaintRoundrect*) pDoc->m_pSelectedTool)->GetPathEndnode(pnt);
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
	}
	else if(pDoc->m_bpaintScp)//TRUE表示正在画软侧移
	{
		((CPaintScp*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL ccc;
		ccc=((CPaintScp*) pDoc->m_pSelectedTool)->GetPathEndnode1(pnt);
		pDoc->m_bEndnodeIndep=!ccc;//TRUE==独立				
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		CPnt p1,p2;
		double angle;
		p1=pDoc->m_pSelectedTool->returnattr1();
		p2=pDoc->m_pSelectedTool->returnattr2();		
		angle=((CPaintScp *)pDoc->m_pSelectedTool)->m_angStart;
		angle=angle*180.0/pi;
		CString str;		
		str.Format("起点(%.4f,%.4f)终点(%.4f,%.4f)车头方向角(%.4f)",p1.x,p1.y,p2.x,p2.y,angle);
		p_Wnd->m_wndMyDialogBar.SetDlgItemText(IDC_EDIT1,str);
	}
	else if(pDoc->m_bpaintSide)//TRUE表示正在画硬侧移
	{
		((CPaintSide*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL ccc;
		ccc=((CPaintSide*) pDoc->m_pSelectedTool)->GetPathEndnode1(pnt);
		pDoc->m_bEndnodeIndep=!ccc;//TRUE==独立				
		pDoc->m_pSelectedTool->DragDraw(&ClientDC, pnt);
		CPnt p1,p2;
		double angle;
		p1=pDoc->m_pSelectedTool->returnattr1();
		p2=pDoc->m_pSelectedTool->returnattr2();		
		angle=((CPaintSide *)pDoc->m_pSelectedTool)->m_angHeading;
		angle=angle*180.0/pi;
		CString str;		
		str.Format("起点(%.4f,%.4f)终点(%.4f,%.4f)车头方向角(%.4f)",p1.x,p1.y,p2.x,p2.y,angle);
		p_Wnd->m_wndMyDialogBar.SetDlgItemText(IDC_EDIT1,str);
	}

	CScrollView::OnMouseMove(nFlags, point);
}

void CPaintobjView::InitView()
{
	double fbasicscale1;
	CPaintobjDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CSize siz(3,3);
//	pDoc->GetBounds(&siz);
	m_bZoomMode = FALSE;
	SetScrollSizes(MM_TEXT, siz);
	fbasicscale1=(double) ((fxmax-fxmin)/(0.8*m_wscreen));	
	fbasicscale=(double) ((fymax-fymin)/(0.8*m_hscreen));
	if(fbasicscale1>fbasicscale) fbasicscale=fbasicscale1;
	m_xstart=(double) (fxmin-fbasicscale*m_wscreen*0.1);
	m_ystart=(double) (fymin-fbasicscale*m_hscreen*0.1);
}

void CPaintobjView::OnInitialUpdate() 
{
	CScrollView::OnInitialUpdate();
	InitView();	
}

void CPaintobjView::OnViewScroll() 
{
	CPaintobjDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	CSize siz;
	pDoc->GetBounds(&siz);
	
	m_bZoomMode = FALSE;
	SetScrollSizes(MM_TEXT, siz);

⌨️ 快捷键说明

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