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

📄 drawshapeview.cpp

📁 用于地理信息系统(GIS)行业程序。 完整的鼠标交互式地图点、线、面的绘制
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		CDC MemDC;
		MemDC.CreateCompatibleDC(NULL);
		CBitmap* pOldBitmap = MemDC.SelectObject(&m_MemBitmap);	


		SetCapture();
		LPtoAP(point.x,point.y,&x,&y);
		m_PointArray[m_PushNum].x=x;
		m_PointArray[m_PushNum].y=y;

	 if(m_PushNum == 0)
	 {		
		m_PointOld=point;
		m_PointOrg=point;   //只要按下左键就要重新记录为原点
	 }
	 else
	 {
		m_PointOld=m_PointOrg;
		m_PointOrg=point;   //只要按下左键就要重新记录为原点

		MemDC.MoveTo(m_PointOld);
		MemDC.LineTo(point);

	 }


		clientDC.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
		MemDC.SelectObject(pOldBitmap);
		MemDC.DeleteDC();

/*

		if(m_PushNum == 0)
		{
			m_PointOrg=point;   //只要按下左键就要重新记录为原点
			m_PointOld=point;
		}
		else
		{
			m_PointOrg = m_PointOld;
			m_PointOld = point;
		}

		MemDC.MoveTo(m_PointOrg);
		MemDC.LineTo(m_PointOld);

		clientDC.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
		MemDC.SelectObject(pOldBitmap);
		MemDC.DeleteDC();
*/
		m_PushNum++;

		//		}
		//		else
		//		{
		//			m_PointOrg=point;
		//		}
	}
	else if(m_DrawType == 4)	//画点
	{
		CDrawShapeDoc* pDoc=GetDocument();
		CClientDC client_dc(this);

//		CDC MemDC;
//		MemDC.CreateCompatibleDC(NULL);
//		CBitmap* pOldBitmap = MemDC.SelectObject(&m_MemBitmap);	

		float fXcoord;	//X、Y坐标
		float fYcoord;
		LPtoAP(point.x,point.y,&fXcoord,&fYcoord);

//		CPointShape* pPoint = new CPointShape(m_ColorPen,m_ColorBrush,
//			m_LineWide,m_LineType,m_Layer,gpCGraphPara->GetIdOnly(),0,
// 			fXcoord,fYcoord);

		pDoc->AddPoint(m_ColorPen,m_ColorBrush,	m_LineWide,
			m_LineType,m_Layer,2/*m_Layer,gpCGraphPara->GetIdOnly()*/,0,
			fXcoord,fYcoord)->Draw(&client_dc,0,0,m_Color);

//		clientDC.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
//		MemDC.SelectObject(pOldBitmap);
// 		MemDC.DeleteDC();

	}
	else if(m_DrawType==13 || m_DrawType==21)//进行框选放大或移动
	{



		
		//放大时改变起始坐标及比例尺
		if(m_DrawType==13) //框选放大
		{
			
			if(m_PushNum==0)
			{
				m_PointOrg=point;
				m_PointOld=point;
				m_PushNum++;
				SetCapture();
			}
			else if(m_PushNum==1)
			{
				//得到放大或移动矩形区域左下点和右上点像素坐标
				int x1,y1,x2,y2;
				x1=min(m_PointOrg.x,point.x);
				y1=max(m_PointOrg.y,point.y);
				x2=max(m_PointOrg.x,point.x);
				y2=min(m_PointOrg.y,point.y);
				
				//将左下点(x1,y1)设为当前屏幕的起始点(实际坐标)
				LPtoAP(x1,y1,&m_xStart,&m_yStart);
				float blc1=(float)m_wScreen/(x2-x1);
				float blc2=(float)m_hScreen/(y1-y2);
				
				if(blc2<blc1)
					blc1=blc2;		//取较小的变化比例
				if(blc1>0)   
					blc=blc/blc1;	//改变显示比例
				
				//				float blc1=(float)(x2-x1)/m_wScreen;
				//				float blc2=(float)(y1-y2)/m_hScreen;
				
				
				//取纵横方向的较小比例尺
				//	blc=(blc1 < blc2 ? blc1:blc2);
				//	m_DrawType=0; //结束框选放大 
				
				m_PushNum=0;   //使得再次点击左键时会再进行框选放大 
				
				
			}
		} 

/*
		else  //移动
		{
			//移动时只改变起始坐标m_xStart,m_yStart,但不改变比例尺blc
			m_xStart=m_xStart-blc*(point.x-m_PointOrg.x);
			m_yStart=m_yStart+blc*(point.x-m_PointOrg.y);
			m_PushNum=0;
			
		}
*/		

		ReleaseCapture();
		Invalidate(); //重画,调用视图类OnDraw函数,从而在APtoLP中重新
		//用现有m_xStart,m_yStart,blc进行放大或移动后的绘图
		
	}
	else if(m_DrawType==22) //如果是 hand-cursor move map

	{

	//	m_PushNum=0;
		m_PointOrg = point;
		m_PointOld = point;

		iNewX = 0;			//设置位图拷贝到的新位置起点为0
		iNewY = 0;

//		Invalidate();	//获得位图

		//获得鼠标按下去时的地图边界,在鼠标移动时
		//改变此时地图边界的值,而不改变此时地图与
		//屏幕的相交范围
		int iXmin,iYmin,iXmax,iYmax;
		float fXmin,fYmin,fXmax,fYmax;
		CRect rcIntersect;
		CRgn rgnScreen,rgnMap,rgnIntersect;

		GetMapBound(fXmin,fYmin,fXmax,fYmax);
		APtoLP(fXmin,fYmin,&iXmin,&iYmin);
		APtoLP(fXmax,fYmax,&iXmax,&iYmax);
		rgnMap.CreateRectRgn(iXmin,iYmin,iXmax,iYmax);
		rgnScreen.CreateRectRgn(0,0,iWScreen,iHScreen);
		rgnIntersect.CreateRectRgn(0,0,iWScreen,iHScreen);
		rgnIntersect.CombineRgn(&rgnScreen,&rgnMap,RGN_AND);
		rgnIntersect.GetRgnBox(&rcIntersect);

		//记录相交矩形的左上角,右下角坐标 
		//在鼠标移动时,改变该矩形坐标位置
		m_XminIntersect = rcIntersect.left;
		m_YminIntersect = rcIntersect.top;
		m_XmaxIntersect = rcIntersect.right;
		m_YmaxIntersect = rcIntersect.bottom;



/*
		GetMapBound(fXmin,fYmin,fXmax,fYmax);
		APtoLP(fXmin,fYmin,&iXmin,&iYmin);
		APtoLP(fXmax,fYmax,&iXmax,&iYmax);
		rgnMap.CreateRectRgn(iXmin,iYmin,iXmax,iYmax);
		rgnScreen.CreateRectRgn(0,0,iWScreen,iHScreen);
		rgnFill.CreateRectRgn(0,0,iWScreen,iHScreen);
		rgnFill.CombineRgn(&rgnScreen,&rgnMap,RGN_DIFF);


		CDC MemDC;				//首先定义一个显示设备对象
		CBitmap MemBitmap;		//定义一个位图对象
		MemDC.CreateCompatibleDC(NULL);
		m_MemBitmap.SetBitmapDimension(3*iWScreen,3*iHScreen);
		CBitmap *pOldBit=MemDC.SelectObject(&m_MemBitmap);
		MemDC.FillSolidRect(0,0,3*iWScreen,3*iHScreen,RGB(255,255,255));

		//遍历所有图形元素并绘制 
		// 1-直线 2-连续直线或多边形区域 3-点
		for(int i=1; i<4; i++)
		{
			for(int j=0; j <=  pDoc->GetGraphUpperBound(i); j++)
			{
				pDoc->GetGraph(i,j)->Draw(&MemDC,0,0,m_Color);
			}
		}


	
		//将内存(MemDC)中的图形拷贝到屏幕上(pDC)进行显示

//		clientDC.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
		
	
		//绘图完成后的清理
		MemDC.SelectObject(pOldBit);
		MemDC.DeleteDC();			//清除DC	

*/

		m_PushNum++;
		SetCapture();
	}
	else if(m_DrawType==11)		 //放大
	{
		float Xold,Yold;
		float x1,y1;



//放大前的左击鼠标点位置

		LPtoAP(point.x,point.y,&Xold,&Yold);

//使比例改变,默认1.5的比例
		blc /= 1.5;

//放大后的左击鼠标点位置

		LPtoAP(point.x,point.y,&x1,&y1);

//算出放大前后鼠标点的偏移量
		float Xdat=Xold - x1;
		float Ydat=Yold - y1;

//使原点改变该偏移量,也就是使得鼠标点击处总于放大前的视图位置
		m_xStart=m_xStart+Xdat;
		m_yStart=m_yStart+Ydat;
//重画	
		Invalidate();

	}
	else if(m_DrawType==12)		//缩小
	{
		float Xold,Yold;
		float x1,y1;



//缩小前的左击鼠标点位置

		LPtoAP(point.x,point.y,&Xold,&Yold);

//使比例改变,默认1.5的比例
		blc *= 1.5;

//缩小后的左击鼠标点位置

		LPtoAP(point.x,point.y,&x1,&y1);

//算出缩小前后鼠标点的偏移量
		float Xdat=Xold - x1;
		float Ydat=Yold - y1;

//使原点改变该偏移量,也就是使得鼠标点击处总于缩小前的视图位置
		m_xStart=m_xStart+Xdat;
		m_yStart=m_yStart+Ydat;
//重画	
		Invalidate();
	}







	

	CView::OnLButtonDown(nFlags, point);
}

void CDrawShapeView::OnDrawPolyline() 
{
	// TODO: Add your command handler code here
	m_DrawType=2; //连续直线
	m_PushNum=0;
	
}

void CDrawShapeView::OnDrawPolygon() 
{
	// TODO: Add your command handler code here
	m_PushNum=0;
	m_DrawType=3;//多边形区域
}

void CDrawShapeView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC client_dc(this);
//	client_dc.SetROP2(R2_NOT);

//	int iWScreen,iHScreen;	//屏幕宽度、高度
//	iWScreen = GetSystemMetrics(SM_CXSCREEN);
//	iHScreen = GetSystemMetrics(SM_CYSCREEN);
	


	//记录鼠标位置,在状态栏中显示
	m_PointMouse=point;


	if(m_DrawType==1 && m_PushNum==1)//画直线 
	{
		CPen pen(m_LineType,m_LineWide,m_ColorPen);
		CPen* pOldPen=client_dc.SelectObject(&pen);

/*
		client_dc.MoveTo(m_PointOrg);//擦除
		client_dc.LineTo(m_PointOld);
		//	client_dc.SetROP2(R2_COPYPEN);
*/
		CDC MemDC;
		MemDC.CreateCompatibleDC(NULL);
		CBitmap* pOldBitmap = MemDC.SelectObject(&m_MemBitmap);
		client_dc.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);

		client_dc.MoveTo(m_PointOrg);//画橡皮线
		client_dc.LineTo(point);
		
		client_dc.SelectObject(pOldPen);

		MemDC.SelectObject(pOldBitmap);
		MemDC.DeleteDC();
/*


		//当没有绘图操作时,不用进行以下MemDC等的创建

		CDC MemDC;
		CBitmap MemBitmap;
		MemDC.CreateCompatibleDC(NULL);
		MemBitmap.CreateCompatibleBitmap(&client_dc,iWScreen,iHScreen);
		CBitmap* pOldBitmap = MemDC.SelectObject(&MemBitmap);
		CPen pen(PS_SOLID,m_LineWide,m_ColorPen);
		CPen* pOldPen=MemDC.SelectObject(&pen);
		MemDC.SetROP2(R2_NOT);

		//填充白色背景
	
		MemDC.FillSolidRect(0,0,iWScreen,iHScreen,RGB(255,255,255));
		


		MemDC.MoveTo(m_PointOrg);//擦除
		MemDC.LineTo(m_PointOld);
		//	client_dc.SetROP2(R2_COPYPEN);
		MemDC.MoveTo(m_PointOrg);//画橡皮线
		MemDC.LineTo(point);

		
		client_dc.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);
		MemDC.SelectObject(pOldPen);
		MemDC.SelectObject(pOldBitmap);
		MemBitmap.DeleteObject();
		MemDC.DeleteDC();
*/

		m_PointOld=point;
	}
	else if((m_DrawType==2 || m_DrawType==3) && m_PushNum > 0) //画连续直线或多边形区域
	{
		CDC MemDC;
		MemDC.CreateCompatibleDC(NULL);
		CBitmap* pOldBitmap = MemDC.SelectObject(&m_MemBitmap);
		client_dc.BitBlt(0,0,iWScreen,iHScreen,&MemDC,0,0,SRCCOPY);



//		client_dc.MoveTo(m_PointOrg);//擦除
//		client_dc.LineTo(m_PointOld);
		client_dc.MoveTo(m_PointOrg);//画橡皮线
		client_dc.LineTo(point);

		
		MemDC.SelectObject(pOldBitmap);
		MemDC.DeleteDC();
//		m_PointOld=point;
	}
	else if(m_DrawType==13 && m_PushNum==1) //框选放大 
	{
		CClientDC dcClient(this);
		dcClient.SetROP2(R2_NOT);
		
		CPen pen(PS_DASH,m_LineWide,3);
	//	CBrush brush(RGB(152,0,0));
		
		CPen* pOldPen=client_dc.SelectObject(&pen); //用虚线画矩形
		//		CBrush* pOldBrush=client_dc.SelectObject(&brush); //用虚线画矩形
		
		
		dcClient.SelectStockObject(HOLLOW_BRUSH);
		//	client_dc.MoveTo(m_PointOrg.x,m_PointOrg.y);
		
		dcClient.Rectangle(m_PointOrg.x,m_PointOrg.y,m_PointOld.x,m_PointOld.y);
		dcClient.Rectangle(m_PointOrg.x,m_PointOrg.y,point.x,point.y);
		
		m_PointOld=point;
		dcClient.SelectObject(pOldPen); 
		//	client_dc.SelectObject(pOldBrush); 
		
	}
	else if(m_DrawType==22 && m_PushNum==1)  //move map
	{
		float Xorg,Yorg,Xcur,Ycur; //实际坐标
		float Xoffset,Yoffset;	//偏移量

		//算出当前点与原来点的实际偏移量
		//以该偏移量改变起始点位置
		//改变了其位置,但是没有重绘,只有在OnLButtonDown时才会重绘的

		LPtoAP(m_PointOld.x,m_PointOld.y,&Xorg,&Yorg);
		LPtoAP(point.x,point.y,&Xcur,&Ycur);
		Xoffset = Xcur - Xorg;
		Yoffset = Ycur - Yorg;
		m_xStart -= Xoffset;
		m_yStart -= Yoffset;

/*		float Xmin,Ymin,Xmax,Ymax; //边界矩形坐标 
		int Xminlog,Yminlog;	//逻辑坐标 
		int Xmaxlog,Ymaxlog;
*/



/*原来的代码

		m_xStart-=(point.x-m_PointOrg.x)*blc/15;
		m_yStart-=(m_PointOrg.y-point.y)*blc/15;

*/



		//遍历所有图形元素并得到所有图形的边界矩形 
		// 1-直线 2-连续直线或多边形区域 3-点

/*
		GetGraphBound(Xmin,Ymin,Xmax,Ymax);

		APtoLP(Xmin,Ymin,&Xminlog,&Yminlog);
		APtoLP(Xmax,Ymax,&Xmaxlog,&Ymaxlog);

		CRect RectOld(Xminlog-1,Yminlog-1,Xmaxlog+1,Ymaxlog+1);
		InvalidateRect(RectOld);
*/		

		 
/* 

		GetGraphBound(Xmin,Ymin,Xmax,Ymax);

		APtoLP(Xmin,Ymin,&Xminlog,&Yminlog);
		APtoLP(Xmax,Ymax,&Xmaxlog,&Ymaxlog);

		CRect RectNew(Xminlog-1,Yminlog-1,Xmaxlog+1,Ymaxlog+1);
		InvalidateRect(RectNew);
*/	
		CDC MemDC;

⌨️ 快捷键说明

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