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

📄 paintvw.cpp

📁 这是书上的代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
}

void CPaintobjView::OnUpdateViewScroll(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(!m_bZoomMode);
}

void CPaintobjView::OnUpdateViewZoomfit(CCmdUI* pCmdUI) 
{
	CPaintobjDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	//条件 GetUpperBound( ) ==-1指出的是数组没有元素
	pCmdUI->SetCheck(m_bZoomMode);
	pCmdUI->Enable((pDoc->m_Objects.GetUpperBound())>-1);
}

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

	CSize siz;
	pDoc->GetBounds(&siz);
	m_bZoomMode = TRUE;
	SetScaleToFitSize(siz);
}


void CPaintobjView::OnUpdateEditCopy(CCmdUI* pCmdUI) 
{
	CPaintobjDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pCmdUI->Enable(pDoc->m_nGraphSelect);
}

void CPaintobjView::OnUpdateEditCut(CCmdUI* pCmdUI) 
{
	CPaintobjDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	pCmdUI->Enable(pDoc->m_nGraphSelect);
}

void CPaintobjView::OnEditCut() 
{
	CPaintobjDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
//	if(!pDoc->WriteClipBoard())//将图形写入剪裁板
//	{AfxMessageBox("写入剪裁板出错");
//	}	
	CPainted*	pPainted;	
	for(int i=0;i<pDoc->m_nGraphSelect;i++)
	{
		int nShapes = pDoc->NumShapes();
		for (int index = 0; index < nShapes; index++)
		{
		    pPainted =(CPainted*) pDoc->GetShape(index);
			if (pPainted->m_bSelect)
			{
				pDoc->m_Objects.RemoveAt(index);
				delete pPainted;
				pPainted = NULL;
				break;
			}
		}
	}
	pDoc->m_nGraphSelect=0;

	CRect rect;
	pDoc->ExpandBounds(&rect);
	CSize siz;
	pDoc->GetBounds(&siz);
	SetScrollSizes(MM_TEXT, siz);
	pDoc->GetPathIdMax();
	pDoc->GetNodeIdMax();//更新m_uCurNodeIdMax
	Invalidate();	

	if (m_bZoomMode)
		OnViewZoomfit();
	else
		OnViewScroll();

	return;
}

void CPaintobjView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
	ASSERT(pDoc != NULL);
	CClientDC ClientDC(this);
	OnPrepareDC(&ClientDC);
	ClientDC.DPtoLP(&point);
	//按下右键结束Polygon的绘制
	if (m_bTracking && pDoc->m_bpaintPolygon==TRUE)
	{	
		if(pDoc->m_nCount>=3)
		{
			UINT type1,index1;			
			ASSERT(pDoc->m_pSelectedTool != NULL);		
			((CPaintPolygon*) pDoc->m_pSelectedTool)->m_uCount=pDoc->m_nCount;//m_npushnumber;//顶点数量
			((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pntData=new CPnt[pDoc->m_nCount];//顶点数组
			for(int i=0;i<pDoc->m_nCount;i++)
			{
				((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pntData[i].x=pDoc->PointXY[i].x;
				((CPaintPolygon*) pDoc->m_pSelectedTool)->m_pntData[i].y=pDoc->PointXY[i].y;
			}
			pDoc->m_Objects.Add(pDoc->m_pSelectedTool);
			SelectClear();//放弃选中的图形元素
			Invalidate();
			pDoc->m_pSelectedTool->m_bSelect=TRUE;
			m_npushnumber=0;//按下左键次数清零
			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);
	
			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();
		}
		else
		{			
			Invalidate();
			m_npushnumber=0;//按下左键次数清零
			pDoc->NoPaint();
			pDoc->m_nSelectedTool = ID_TOOL_SELECTOR;
			pDoc->m_bZoomIn= FALSE;
			pDoc->m_bZoomOut= FALSE;
			m_bTracking = FALSE;
			ReleaseCapture();
			pDoc->GenerateTool();			
		}
  	}
	else//正常的右键功能
	{		
		if(pDoc->m_bDisNodeState)
		{
			NodeStateReset();//节点状态复位
			pDoc->m_bDisNodeState=FALSE;//不显示节点自检结果
			Invalidate();
		}
		if(m_npushnumber==1||m_npushnumber==2)
		{
			Invalidate();
		}
		m_npushnumber=0;//按下左键次数清零
		pDoc->NoPaint();
		pDoc->m_bZoomIn= FALSE;
		pDoc->m_bZoomOut= FALSE;
		m_bTracking = FALSE;
		ReleaseCapture();
		SelectClear();//放弃选中的图形元素
		pDoc->m_nSelectedTool = ID_TOOL_SELECTOR;
		pDoc->GenerateTool();	
	}
	// TODO: Add your message handler code here and/or call default
	CScrollView::OnRButtonDown(nFlags, point);
}

void CPaintobjView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	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 && !(pDoc->m_bZoomIn) && !(pDoc->m_bZoomOut))//m_bZoomIn= FALSE;m_bZoomOut= FALSE;
	{
		BOOL        bhitarc;
		CPainted*	pPainted;
		CPainted*	pHit;//双击线段
		CPainted*	pHitNode;//双击节点
		pHit = NULL;
		pHitNode = NULL;
		UINT somenode=0;
		int indexx;//用于保存选中图形的索引
		int nShapes = pDoc->NumShapes();
	    for (int index = 0; index < nShapes; index++)
		{
		    pPainted = pDoc->GetShape(index);
			somenode=pPainted->IsHit1(pnt);
			if(somenode)
			{	//清除以前选中的图形后选中当前图形
				SelectClear();
				pHitNode =pPainted;	
				indexx=index;
				break;
			}
			if (pPainted->IsHit(pnt))
			{   bhitarc=(pPainted->m_bhitarc);//TRUE表示圆弧被选中
				pHit = pPainted;
				break;
			}
		}
loop1:
		if(somenode)
		{
			CPnt point1;
			CNodeattr  Nodeattr;
			//pHitNode =pPainted;
			if(somenode==1)
			{
				point1=pHitNode->returnattr1();
				Nodeattr.m_fNodex=point1.x;
				Nodeattr.m_fNodey=point1.y;				
				Nodeattr.m_uNodeId=pHitNode->m_uStartNodeId;
				UINT id=pHitNode->m_uStartNodeId;
				Nodeattr.m_fHeading=pHitNode->m_fStartHeading;
				UINT type=pHitNode->m_uStartNodeType;				
				if(type&0x01) Nodeattr.m_bCheck1=TRUE;
				if(type&0x02) Nodeattr.m_bCheck2=TRUE;
				if(type&0x04) Nodeattr.m_bCheck3=TRUE;
				if(type&0x08) Nodeattr.m_bCheck4=TRUE;				
				int result=Nodeattr.DoModal();				
				if(result==IDOK)
				{	
					//如果更改了节点号,不能与某存在的节点号相同
					//必须定义新的节点号
					CPainted*	pPainter;
					if(id!=Nodeattr.m_uNodeId)
					{
						BOOL breturn=FALSE;
						int nShapes = pDoc->NumShapes();
						for (int index = 0; index < nShapes; index++)
						{
							pPainter =pDoc->GetShape(index);
							if(pPainter->m_uStartNodeId==Nodeattr.m_uNodeId||pPainter->m_uEndNodeId==Nodeattr.m_uNodeId)
							{
								CString str="更改后的节点号不能与某存在的节点号相同,必须重新定义新的节点号!";
								AfxMessageBox(str);
								breturn=TRUE;
								break;
							}
						}
						if(breturn)	{goto loop1;}
					}
					int nShapes = pDoc->NumShapes();
					for (int index = 0; index < nShapes; index++)
					{
						pPainter =pDoc->GetShape(index);
						if(pPainter->m_uStartNodeId==id)
						{ 
							pPainter->m_uStartNodeId=Nodeattr.m_uNodeId;
							pPainter->m_fStartHeading=Nodeattr.m_fHeading;					
							type=0;
							if(Nodeattr.m_bCheck1) type|=0x01;
							if(Nodeattr.m_bCheck2) type|=0x02;
							if(Nodeattr.m_bCheck3) type|=0x04;
							if(Nodeattr.m_bCheck4) type|=0x08;
							pPainter->m_uStartNodeType=type;							
						}
						else if(pPainter->m_uEndNodeId==id)
						{
							pPainter->m_uEndNodeId=Nodeattr.m_uNodeId;
							pPainter->m_fEndHeading=Nodeattr.m_fHeading;					
							type=0;
							if(Nodeattr.m_bCheck1) type|=0x01;
							if(Nodeattr.m_bCheck2) type|=0x02;
							if(Nodeattr.m_bCheck3) type|=0x04;
							if(Nodeattr.m_bCheck4) type|=0x08;
							pPainter->m_uEndNodeType=type;
						}
					}
					pDoc->GetNodeIdMax();//更新m_uCurNodeIdMax
					pHitNode->m_bSelectStartNode=TRUE;//TRUE表示图形元素起点被选中
					UINT type1=pHitNode->m_uFigureType;				
					pHitNode->m_bSelect=TRUE;
					BOOL bbb=pDoc->AddSelectList(type1,indexx);
					pHitNode->DrawSelected(&ClientDC,this);					
				}
			}
			else if(somenode==2)
			{
				point1=pHitNode->returnattr2();				
				Nodeattr.m_fNodex=point1.x;
				Nodeattr.m_fNodey=point1.y;				
				Nodeattr.m_uNodeId=pHitNode->m_uEndNodeId;
				UINT id=pHitNode->m_uEndNodeId;
				Nodeattr.m_fHeading=pHitNode->m_fEndHeading;
				UINT type=pHitNode->m_uEndNodeType;				
				if(type&0x01) Nodeattr.m_bCheck1=TRUE;
				if(type&0x02) Nodeattr.m_bCheck2=TRUE;
				if(type&0x04) Nodeattr.m_bCheck3=TRUE;
				if(type&0x08) Nodeattr.m_bCheck4=TRUE;
				int result=Nodeattr.DoModal();
				if(result==IDOK)
				{
					//如果更改了节点号,不能与某存在的节点号相同
					//必须定义新的节点号
					CPainted*	pPainter;				
					if(id!=Nodeattr.m_uNodeId)
					{
						BOOL breturn=FALSE;
						int nShapes = pDoc->NumShapes();
						for (int index = 0; index < nShapes; index++)
						{
							pPainter =pDoc->GetShape(index);
							if(pPainter->m_uStartNodeId==Nodeattr.m_uNodeId||pPainter->m_uEndNodeId==Nodeattr.m_uNodeId)
							{
								CString str="更改后的节点号不能与某存在的节点号相同,必须重新定义新的节点号!";
								AfxMessageBox(str);
								breturn=TRUE;
								break;
							}
						}
						if(breturn)	{goto loop1;}
					}
					//节点编号更改了以后,应与m_uCurNodeIdMax
					//比较,大则要更新m_uCurNodeIdMax					
					int nShapes = pDoc->NumShapes();
					for (int index = 0; index < nShapes; index++)
					{
						pPainter =pDoc->GetShape(index);
						if(pPainter->m_uStartNodeId==id)
						{ 
							pPainter->m_uStartNodeId=Nodeattr.m_uNodeId;
							pPainter->m_fStartHeading=Nodeattr.m_fHeading;					
							type=0;
							if(Nodeattr.m_bCheck1) type|=0x01;
							if(Nodeattr.m_bCheck2) type|=0x02;
							if(Nodeattr.m_bCheck3) type|=0x04;
							if(Nodeattr.m_bCheck4) type|=0x08;
							pPainter->m_uStartNodeType=type;							
						}
						else if(pPainter->m_uEndNodeId==id)
						{
							pPainter->m_uEndNodeId=Nodeattr.m_uNodeId;
							pPainter->m_fEndHeading=Nodeattr.m_fHeading;					
							type=0;
							if(Nodeattr.m_bCheck1) type|=0x01;
							if(Nodeattr.m_bCheck2) type|=0x02;
							if(Nodeattr.m_bCheck3) type|=0x04;
							if(Nodeattr.m_bCheck4) type|=0x08;
							pPainter->m_uEndNodeType=type;
						}
					}					
					pDoc->GetNodeIdMax();//更新m_uCurNodeIdMax			
					pHitNode->m_bSelectEndNode=TRUE;//TRUE表示图形元素终点被选中
					UINT type1=pHitNode->m_uFigureType;				
					pHitNode->m_bSelect=TRUE;
					BOOL bbb=pDoc->AddSelectList(type1,indexx);
					pHitNode->DrawSelected(&ClientDC,this);					
				}
			}			
		}
		if (pHit != NULL)
		{	
			pHit->IsDblClk(pDoc,this);			
		}
	}
	CScrollView::OnLButtonDblClk(nFlags, point);
}

BOOL CPaintobjView::PreCreateWindow(CREATESTRUCT& cs) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	return CScrollView::PreCreateWindow(cs);
}


void CPaintobjView::OnSize(UINT nType, int cx, int cy) 
{	
	CScrollView::OnSize(nType, cx, cy);
	m_wscreen=cx;//客户区宽度(逻辑坐标)
	m_hscreen=cy;//客户区高度(逻辑坐标)	
	// TODO: Add your message handler code here
/*	double fbasicscale1;
	CPaintobjDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CSize siz;
	pDoc->GetBounds(&siz);
	m_bZoomMode = FALSE;
	SetScrollSizes(MM_TEXT, siz);
	fbasicscale1=(double) ((fxmax-fxmin)/(0.6*m_wscreen));	
	fbasicscale=(double) ((fymax-fymin)/(0.6*m_hscreen));
	if(fbasicscale1>fbasicscale) fbasicscale=fbasicscale1;
	m_xstart=(double) (fxmin-fbasicscale*m_wscreen*0.2);
	m_ystart=(double) (fymin-fbasicscale*m_hscreen*0.2);
	Invalidate();*/
}

void CPaintobjView::OnOptionSetorigin() 
{
	// TODO: Add your command handler code here
	m_bSetorigin= TRUE;//设置原点
}

void CPaintobjView::OnOptionSetscale() 
{
	// TODO: Add your command handler code here
	double fbasicscale1;
	CSetscale setscale;	
	int result=setscale.DoModal();	
	if(result==IDOK)
		{
			UpdateData(true);
			fbasicscale1=(double) ((setscale.m_x)/(1.0*m_wscreen));	
			fbasicscale=(double) ((setscale.m_y)/(1.0*m_hscreen));
			if(fbasicscale1>fbasicscale) fbasicscale=fbasicscale1;
			Invalidate();
		}
}

BOOL CPaintobjView::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
		CBrush*	pOldBrush;
		CBrush	DrawBrush;
		DrawBrush.CreateSolidBrush(RGB(127, 127, 127));
		pOldBrush = pDC->SelectObject(&DrawBrush);
		CBrush br( GetSysColor( COLOR_WINDOW ) );
	    FillOutsideRect(pDC, &br);
//	FillOutsideRect(pDC, &DrawBrush );
		pDC->SelectObject(pOldBrush);
	return CScrollView::OnEraseBkgnd(pDC);
}

void CPaintobjView::OnViewRevert() 
{
	// TODO: Add your command handler code here
	CPaintobjDoc* pDoc = (CPaintobjDoc*) GetDocument();
	ASSERT(pDoc != NULL);
	pDoc->m_bZoomIn= FALSE;

⌨️ 快捷键说明

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