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

📄 paintvw.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			pDoc->PointXY[m_npushnumber].y=pnt.y;
			if(m_npushnumber==0)
			{
				SetCapture();
				pDoc->m_pSelectedTool->OnDown(pnt);
			}
			else
			{
				pDoc->m_pSelectedTool->m_pointPrimary=((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pointEnd;
				((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pointEnd=pnt;
			}
			m_npushnumber++;
			pDoc->m_nCount=m_npushnumber;
		}
		else////给定所有顶点画法
		{m_bTracking = TRUE;
		}
	}
	else if(pDoc->m_bpaintRect)	//TRUE表示正在画矩形
	{
		SetCapture();
		m_bTracking = TRUE;
		CPnt pnt2;
		((CPaintRect*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		((CPaintRect*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
		pDoc->m_pSelectedTool->OnDown(pnt);
	}
	else if(pDoc->m_bpaintRoundrect)//TRUE表示正在画圆角矩形
	{
		SetCapture();
		m_bTracking = TRUE;
		CPnt pnt2;
		((CPaintRoundrect*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		((CPaintRoundrect*) pDoc->m_pSelectedTool)->GetPathStartnode(pnt,pnt2);
	
		((CPaintRoundrect*) pDoc->m_pSelectedTool)->m_ellwidth=pnt2.x;
		((CPaintRoundrect*) pDoc->m_pSelectedTool)->m_ellheight=pnt2.y;
		pDoc->m_pSelectedTool->OnDown(pnt);
	}
	else if(pDoc->m_bpaintScp)//TRUE表示正在画软侧移
	{
		SetCapture();
		m_bTracking = TRUE;
		CPnt pntt;
		double angle=0;
		UINT id;
		if(pDoc->m_ScpPaintMode==1||pDoc->m_ScpPaintMode==2)//路径的绘制模式
		{
			pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
		}
		((CPaintScp*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL yy=((CPaintScp*) 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表示自动取角
		{
			((CPaintScp*) pDoc->m_pSelectedTool)->m_angStart=pDoc->m_dPaintAngle*pi/180.0;// 起点的倾斜角(世界坐标系中)
		}
		else
		{
			((CPaintScp*) pDoc->m_pSelectedTool)->m_angStart=angle;// 起点的倾斜角(世界坐标系中)	
		}
		pDoc->m_pSelectedTool->OnDown(pnt);
	}
	else if(pDoc->m_bpaintSide)//TRUE表示正在画硬侧移
	{
		SetCapture();
		m_bTracking = TRUE;
		CPnt pntt;
		double angle=0;
		UINT id;
		if(pDoc->m_SidePaintMode==1||pDoc->m_SidePaintMode==2)//路径的绘制模式
		{
			pnt=pDoc->m_pPaintStartNode;//绘图时给定的起点
		}
		((CPaintSide*) pDoc->m_pSelectedTool)->m_pDoc=pDoc;
		BOOL yy=((CPaintSide*) 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表示自动取角
		{
			((CPaintSide*) pDoc->m_pSelectedTool)->m_angHeading=pDoc->m_dPaintAngle*pi/180.0;// 起点的倾斜角(世界坐标系中)
		}
		else
		{
			((CPaintSide*) pDoc->m_pSelectedTool)->m_angHeading=angle;// 起点的倾斜角(世界坐标系中)	
		}
		pDoc->m_pSelectedTool->OnDown(pnt);
	}

	else if(m_bSetorigin)
	{
		m_bSetorigin= FALSE;//设置原点
		CPainted* pPainter;
		CPnt pointEnd;
		CPnt pointPrimary;
		CPoint pointEnd1;
		CPoint pointPrimary1;
		CPoint point1;
		DPtoVP(pnt,point1);
		int nShapes = pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{					
		    pPainter =pDoc->GetShape(index);
			pointPrimary=pPainter->returnattr1();
			pointEnd=pPainter->returnattr2();
			DPtoVP(pointPrimary,pointPrimary1);
			DPtoVP(pointEnd,pointEnd1);				
			if(Distance(point1.x,point1.y,pointPrimary1.x,pointPrimary1.y)<5)
			{	pnt.x=pointPrimary.x;
				pnt.y=pointPrimary.y;				
				break;
			}
			else if(Distance(point1.x,point1.y,pointEnd1.x,pointEnd1.y)<5)
			{	pnt.x=pointEnd.x;
				pnt.y=pointEnd.y;					
				break;
			}
		}			
		int nShapes1 = pDoc->NumShapes();
		for (int index1 = 0; index1 < nShapes1; index1++)
		{
			 pPainter =pDoc->GetShape(index1);
			 pPainter->ChangeOrigin(pnt);//
		}			
		CRect rect;
		pDoc->ExpandBounds(&rect);				
		m_xstart-=pnt.x;
		m_ystart-=pnt.y;
		CSize siz;
		pDoc->GetBounds(&siz);	
	}
	else if(pDoc->m_bZoomIn)
	{	::SetCursor(m_hcurZoomin);
		if(fscale>=0.1)
		{
			fscale-=fscale*0.2;
			CRect rect;
			pDoc->ExpandBounds(&rect);
			CSize siz;
			pDoc->GetBounds(&siz);
			SetScrollSizes(MM_TEXT, siz);
			Invalidate();			
			CPoint PP;
			DPtoVP(pnt,PP);//把最终实际坐标变换为逻辑坐标
			CPoint point1(PP.x-m_wscreen/2,PP.y-m_hscreen/2);
			ScrollToPosition(point1);				
		}
	}
	else if(pDoc->m_bZoomOut)
	{	::SetCursor(m_hcurZoomout);
		if(fscale<=5)
		{
			fscale+=1;
			CRect rect;
			pDoc->ExpandBounds(&rect);
			CSize siz;
			pDoc->GetBounds(&siz);
			SetScrollSizes(MM_TEXT, siz);
			Invalidate();
			CPoint PP;
			DPtoVP(pnt,PP);//把最终实际坐标变换为逻辑坐标
			CPoint point1(PP.x-m_wscreen/2,PP.y-m_hscreen/2);
			ScrollToPosition(point1);			
		}
	}
	
	else if(pDoc->m_bMove)//移动图形
	{	pDoc->m_bMove1=TRUE;
		pDoc->m_pStartMove=pnt;//移动图形的起点
		//以下循环声明是首次移动,目的是不擦除原图形
		for(int i=0;i<pDoc->m_nGraphSelect;i++)
		{
			CPainted*	pPainted;
			pPainted =pDoc->GetShape(pDoc->GraphSelect[i].Index);
			pPainted->m_bFirstMove=TRUE; 			
		}		
	}	
	//点击某直线自动取其角度值给对话条的角度编辑框
	else if(pDoc->m_banglelengthok)
	{	
		//得到主框架对象的指针
		CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
		CPainted*	pPainted;		
		UINT nShapes = pDoc->NumShapes();
		for (UINT index = 0; index < nShapes; index++)
		{
		    pPainted = pDoc->GetShape(index);
			if(pPainted->m_uFigureType==0)
			{
				if (pPainted->IsHit(pnt))
				{ 	
					double angle;
					angle=((CPaintLine*) pPainted)->m_fangle;
					angle=angle*180.0/pi;
					//pDoc->m_fangle=angle;					
					CString str;		
					str.Format("%.4f",angle);					
					p_Wnd->m_wndMyDialogBar1.SetDlgItemText(IDC_ANGLE,str);					
					OnChangeAngle(); 
					break;
				}
			}
		}	
	}	
	//选中多个图形元素
	else if(nFlags==(MK_SHIFT|MK_LBUTTON))//	
	{
		CPainted*	pPainted;
		UINT type1,index1;
		UINT nShapes = pDoc->NumShapes();
		for (UINT index = 0; index < nShapes; index++)
		{
		    pPainted = pDoc->GetShape(index);
			if (pPainted->IsHit(pnt))
			{ 	type1=pPainted->m_uFigureType;
				index1=index;
				pPainted->m_bSelect=TRUE;
				BOOL bbb=pDoc->AddSelectList(type1,index);
				if(bbb)					
					pPainted->DrawSelected(&ClientDC,this);
				break;
			}
		}
	}
	//更改参考线段的参考节点,选中图形元素
	else if(pDoc->m_nGraphSelect||nFlags==MK_LBUTTON)//此项应排在最后以免影响其他事件的响应
	{
		if(pDoc->m_nGraphSelect)
		{
			CPainted*	pPainted;			
			UINT bIsHit1=0;
			for (int index = 0; index < pDoc->m_nGraphSelect; index++)
			{
				pPainted =pDoc->GetShape(pDoc->GraphSelect[index].Index);
				bIsHit1=pPainted->IsHit1(pnt);
				if(bIsHit1)
				{
					pPainted->m_bReferencePoint=!pPainted->m_bReferencePoint;
					pPainted->DrawSelected(&ClientDC,this);
					break;
				}
			}	
			if(!bIsHit1)
			{
				UINT type1,index1;
				UINT nShapes = pDoc->NumShapes();
				for (UINT index2 = 0; index2 < nShapes; index2++)
				{
				   pPainted = pDoc->GetShape(index2);
					if (pPainted->IsHit(pnt))
					{ 					
						SelectClear();//放弃选中的图形元素
						type1=pPainted->m_uFigureType;
						index1=index2;
						pPainted->m_bSelect=TRUE;
						BOOL bbb=pDoc->AddSelectList(type1,index2);
						if(bbb)								
							pPainted->DrawSelected(&ClientDC,this);						
						break;
					}
				}
			}
			//
		}
		else
		{
			CPainted*	pPainted;
			UINT type1,index1;
			UINT nShapes = pDoc->NumShapes();
			for (UINT index = 0; index < nShapes; index++)
			{
			    pPainted = pDoc->GetShape(index);
				if (pPainted->IsHit(pnt))
				{ 	type1=pPainted->m_uFigureType;
					index1=index;
					pPainted->m_bSelect=TRUE;
					BOOL bbb=pDoc->AddSelectList(type1,index);
					if(bbb)						
						pPainted->DrawSelected(&ClientDC,this);
					break;
				}
			}
		}
	}
	
	CScrollView::OnLButtonDown(nFlags, point);
}

void CPaintobjView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
	ASSERT(pDoc != NULL);
	CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
	CClientDC ClientDC(this);
	OnPrepareDC(&ClientDC);
	ClientDC.DPtoLP(&point);
	CPnt pnt;
	VPtoDP(point,pnt);//从鼠标得到的逻辑坐标变换为用于保存的最终实际坐标

	if(pDoc->m_bZoomIn)
	{
	 ::SetCursor(m_hcurZoomin);
	}

    if(pDoc->m_bZoomOut)
	{
     ::SetCursor(m_hcurZoomout);
	}
	if(pDoc->m_bMove)
	{
     ::SetCursor(m_hcurMove);
	}
	if(pDoc->m_bMove1)
	{
		pDoc->m_bMove1=FALSE;
		CRect rect;
		pDoc->ExpandBounds(&rect);
		CSize siz;
		pDoc->GetBounds(&siz);
		SetScrollSizes(MM_TEXT, siz);	
		Invalidate();
	}

	if (m_bTracking && pDoc->m_bpaintPolygon==FALSE)
	{	
		if(pDoc->m_bpaintLine&&pDoc->m_banglelengthok)//定角定长画线
		{
			pDoc->m_banglelengthok=FALSE;
			CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
			CButton* bu=(CButton*)(p_Wnd->m_wndMyDialogBar1.GetDlgItem(IDC_CHECKED));
			bu->SetCheck(0);
		}
		UINT type1,index1;		
		m_npushnumber=0;//左键抬起,按下左键次数清零		
		ASSERT(pDoc->m_pSelectedTool != NULL);
		pDoc->m_Objects.Add(pDoc->m_pSelectedTool);
		SelectClear();//放弃选中的图形元素
		Invalidate();
		pDoc->m_pSelectedTool->m_bSelect=TRUE;
		if(pDoc->m_pSelectedTool->m_uObjectType==0 && (pDoc->m_bpaintarc||pDoc->m_bpaintLine||pDoc->m_bpaintLazys||pDoc->m_bpaintSide||pDoc->m_bpaintScp))
		{
			pDoc->NoPaint();
			//新画一条线段其路径ID必然递增
			pDoc->m_pSelectedTool->m_uPathId=pDoc->m_uCurPathIdMax;
			pDoc->m_uCurPathIdMax++;
			if(pDoc->m_bStartnodeIndep)//线段起点独立
			{			
				pDoc->m_pSelectedTool->m_uStartNodeId=pDoc->m_uCurNodeIdMax;
				pDoc->m_uCurNodeIdMax++;
			}
			else//线段起点不独立
			{
				pDoc->m_bStartnodeIndep=TRUE;
				pDoc->m_pSelectedTool->m_uStartNodeId=pDoc->m_uCurStartnodeId;
			}		
			if(pDoc->m_bEndnodeIndep)//线段终点独立
			{			
				pDoc->m_pSelectedTool->m_uEndNodeId=pDoc->m_uCurNodeIdMax;
				pDoc->m_uCurNodeIdMax++;
			}
			else//线段终点不独立
			{
				pDoc->m_bEndnodeIndep=TRUE;
				pDoc->m_pSelectedTool->m_uEndNodeId=pDoc->m_uCurEndnodeId;
			}
			//pDoc->m_pSelectedTool->GetPostureAngle();//计算得到路段的姿态角(外射角)
		}
		pDoc->m_pSelectedTool->GetPostureAngle();//计算得到路段的姿态角(外射角)
		pDoc->NoPaint();
		type1=pDoc->m_pSelectedTool->m_uFigureType;
		index1=pDoc->m_Objects.GetSize()-1;
		BOOL bbb=pDoc->AddSelectList(type1,index1);
		pDoc->m_pSelectedTool->DrawSelected(&ClientDC,this);
		pDoc->m_pSelectedTool->Normalize();

		CRect rect;
		pDoc->ExpandBounds(&rect);
		CSize siz;
		pDoc->GetBounds(&siz);
		SetScrollSizes(MM_TEXT, siz);		
		pDoc->m_pSelectedTool = NULL;
		pDoc->m_nSelectedTool = ID_TOOL_SELECTOR;
		pDoc->m_bZoomIn= FALSE;
		pDoc->m_bZoomOut= FALSE;
		m_bTracking = FALSE;
		ReleaseCapture();	
  	}

	CScrollView::OnLButtonUp(nFlags, point);
}

void CPaintobjView::OnMouseMove(UINT nFlags, CPoint point) 
{
	CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
	ASSERT(pDoc != NULL);
	CMainFrame *p_Wnd=(CMainFrame*)(AfxGetApp()->m_pMainWnd);
	CClientDC ClientDC(this);
	OnPrepareDC(&ClientDC);
	ClientDC.DPtoLP(&point);
	CPnt pnt;
	VPtoDP(point,pnt);//从鼠标得到的逻辑坐标变换为用于保存的最终实际坐标
	CMainFrame* pMain = (CMainFrame*) AfxGetApp()->m_pMainWnd;

	CString strPosition;
	strPosition.Format(_T("X=%.4fm,Y=%.4fm"), pnt.x, pnt.y);
	pMain->m_wndStatusBar.SetPaneText(1, strPosition);

	if (pDoc->m_pSelectedTool == NULL)
	{		
		if(m_bSetorigin)
		{
		::SetCursor(m_hcurSetorigin);

⌨️ 快捷键说明

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