drawview.cpp

来自「VC做的矢量画图程序!」· C++ 代码 · 共 2,000 行 · 第 1/5 页

CPP
2,000 行
字号
}

//“粘贴"菜单项的对应函数,用来插入剪裁板中的图形元素到图形中
void CDrawView::OnEditPaste() 
{
	DispStatus("请用鼠标点中粘贴的插入顶点");
	m_DrawCurrent=20;
	PushNumb=0;
	::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)m_hcurCross);
}

//“Copy"菜单项的对应函数,用来将选中的图形放在剪裁板
void CDrawView::OnEditCopy() 
{
	CDrawDoc* pDoc = GetDocument();
	short nGraphCut;
	nGraphCut=0;
	for(int i=0;i<pDoc->n_GraphSelect;i++)
	{
		if(pDoc->GraphSelect[i].Lb<=5)	//如果是直线、圆、圆形区域、连续直线和标注文本等5种图形元素
			pDoc->GraphSelect[nGraphCut++]=pDoc->GraphSelect[i];
	}
	pDoc->n_GraphSelect=nGraphCut;
	if(pDoc->WriteClipBoard())	//将图形写入剪裁板
 		DispStatus("操作成功,请选择操作菜单");
}

//“恢复"菜单项的对应函数,用来实现完全的逆操作
void CDrawView::OnEditUndo() 
{
	CDrawDoc* pDoc = GetDocument();
	pDoc->n_GraphSelect=0;
	CClientDC ht(this);
	pDoc->OnEditUndo();			//进行一步逆操作
	pDoc->UpdateAllViews(this);	//重画所有视图
}

//“图形重画”菜单项的映射函数
void CDrawView::OnGraphRedraw() 
{
	CDrawDoc* pDoc = GetDocument();	//得到文档的指针
	Invalidate();
	pDoc->UpdateAllViews(this);
}

//“图形放大”菜单项的映射函数
void CDrawView::OnGraphZoomOut() 
{
	DispStatus("请用鼠标选择放大窗口的一个顶点");
	m_DrawCurrent=11;	//标识进行图形放大操作
	PushNumb=0;
	::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurZoomOut);



}

//“图形移动”菜单项的对应函数
void CDrawView::OnGraphPan() 
{   
	DispStatus("请用鼠标选择移动的基点");
	m_DrawCurrent=12;	//标识进行图形移动操作
	PushNumb=0;
	::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (LONG)m_hcurHand);

}


//“重画上屏”菜单项的对应函数
void CDrawView::OnGraphUp() 
{
	CDrawDoc* pDoc = GetDocument();
	if(pDoc->m_CurrentScreen>pDoc->m_CurrentScreen1)	//如果不是第一屏
		pDoc->m_CurrentScreen--;
	//得到上一屏的图形参数并重画
	m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
	m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
	blc=p_Screen[pDoc->m_CurrentScreen].blc;
//	InitVScroll();
//	InitHScroll();
	Invalidate();
}

//“重画首屏”菜单项的对应函数
void CDrawView::OnGraphFirst() 
{
	CDrawDoc* pDoc = GetDocument();
	m_xStart=p_Screen[pDoc->m_CurrentScreen1].sx;
	m_yStart=p_Screen[pDoc->m_CurrentScreen1].sy;
	blc=p_Screen[pDoc->m_CurrentScreen1].blc;
	pDoc->AddScreen(m_xStart,m_yStart,blc);
//	InitVScroll();
//	InitHScroll();
	Invalidate();
}

//“重画全屏”菜单项的对应函数
void CDrawView::OnGraphAll() 
{
	float minx,miny,maxx,maxy,bl1;
	CDrawDoc* pDoc = GetDocument();
	//捕捉光标,并使光标成沙漏等待光标
	//把最小值给非常大,把最大值给非常小,为了对变量进行初试化
	minx=(float)1E+20;miny=(float)1E+20;maxx=(float)-1E+20;maxy=(float)-1E+20;
	SetCapture();
	SetCursor(LoadCursor(NULL,IDC_WAIT));
	BOOL pb=pDoc->GetRect(&minx,&miny,&maxx,&maxy);
	
	//将光标变为箭头形,放弃捕捉的光标
    SetCursor(LoadCursor(NULL,IDC_ARROW));
    ReleaseCapture();
	if(!pb)						//没有图形元素
	{
		m_xStart=51081;
		m_yStart=92800;
		blc=2.0;
		return;
	}
	else
	{
		bl1=(maxx-minx)/(m_wScreen-20);	//横向比例
		blc=(maxy-miny)/(m_hScreen-20);		//纵向比例
		if(bl1>blc)
			blc=bl1;  //取较大的一个作为比例尺
		/*以下确定屏幕左下角的实际坐标,即在左侧和下侧都留了10点阵的区域
		(minx,miny)在屏幕的左下角向右10点阵同时向上10点阵处。*/
		m_xStart=minx-10*blc;
		m_yStart=miny-10*blc;
		
	}
	//将全图的显示比例放在首屏,并把屏幕设为首屏
	p_Screen[pDoc->m_CurrentScreen1].sx=m_xStart;
	p_Screen[pDoc->m_CurrentScreen1].sy=m_yStart;
	p_Screen[pDoc->m_CurrentScreen1].blc=blc;
	pDoc->m_CurrentScreen=pDoc->m_CurrentScreen1;
//	InitVScroll();
//	InitHScroll();
	Invalidate();
}

//“鼠标选中”菜单项的对应函数
void CDrawView::OnSelectMouse() 
{
	DispStatus("请用鼠标点中需选择的图形元素");
	m_DrawCurrent=30;	//标识进行图形选中操作
	PushNumb=0;
	::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)m_hcurCross);
}

//“图形数据修改”菜单项的对应函数
void CDrawView::OnGreaphModify() 
{
	DispStatus("请用鼠标点中需修改图形数据的图形元素");
	m_DrawCurrent=33;	//标识进行图形选中操作
	PushNumb=0;
	::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)m_hcurCross);
}

//“放弃选中”菜单项的对应函数,用来放弃所作的选择
void CDrawView::OnSelectClear() 
{
	CDrawDoc* pDoc = GetDocument();
	CClientDC ht(this);
	//for(int i=0;i<pDoc->n_GraphSelect;i++)	//将选中的图形元素原样进行绘制
	//	pDoc->DrawGraph(&ht,pDoc->GraphSelect[i].Lb,pDoc->GraphSelect[i].Index,0,0,m_bColor);
	Invalidate();
	pDoc->n_GraphSelect=0;
	if(pDoc->b_IsOleSelect)
	{
		POSITION pos=pDoc->GetStartPosition();
		while(pos!=NULL)
		{
			CDrawCntrItem *pItem=(CDrawCntrItem *)pDoc->GetNextClientItem(pos);
			if(pItem!=NULL)
				pItem->b_Select=FALSE;
		}
		pDoc->b_IsOleSelect=0;
		Invalidate();
	}
}

//设置图形的线型及颜色参数,“线型及颜色设置”菜单项的消息处理函数
void CDrawView::OnGraphParaSET() 
{
	XxColorSetDialog pDg1(m_pColor,m_bColor,m_brColor,m_beColor,m_LineType,m_LineWide);	
	if(pDg1.DoModal()==IDOK)
	{
		m_pColor=pDg1.m_color1;
		m_bColor=pDg1.m_color2;
		m_brColor=pDg1.m_color3;
		m_beColor=pDg1.m_color4;
		m_LineWide=pDg1.m_linewide;
		m_LineType=pDg1.m_linetype;
		Invalidate();
	}
}

//图层管理函数,“分层管理”菜单项的消息处理函数
void CDrawView::OnLayerManage() 
{
	LayerSetDialog pDlg1(p_GraphPara->m_LayerList,p_GraphPara->n_LayerNumb,m_Layer);
	if(pDlg1.DoModal()==IDOK)
	{
		p_GraphPara->n_LayerNumb=pDlg1.m_nLayerNumb;
		m_Layer=pDlg1.m_LayerIndex;
		Invalidate();
	}
}

//选择的图形元素创建图形块的消息处理函数
void CDrawView::OnBlockAdd() 
{
	PushNumb=0;
	m_DrawCurrent=40;	//选择的图形元素形成一个新图形块
	DispStatus("请用鼠标选择图例的插入点");
}

//开始创建新图形块,“制作新图形块”菜单项的消息处理函数
void CDrawView::OnBlockNew() 
{
	CDrawDoc* pDoc = GetDocument();
	m_DrawCurrent=0;
	pDoc->ClearDraw();
	m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
	m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
	blc=p_Screen[pDoc->m_CurrentScreen].blc;
	pDoc->m_DrawEdit=1;
	if(m_DrawCurrent==8)
		m_DrawCurrent=0;
	DispStatus("请选择操作菜单");
//	InitVScroll();
//	InitHScroll();
	Invalidate();
}

//保存编辑的图形块退出图形块编辑状态的消息处理函数
void CDrawView::OnEditBlockOk() 
{
	CDrawDoc* pDoc = GetDocument();
	pDoc->OnEditBlockOk();	
	m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
	m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
	blc=p_Screen[pDoc->m_CurrentScreen].blc;
//	InitVScroll();
//	InitHScroll();
	m_DrawCurrent=0;
	DispStatus("请选择操作菜单");
	Invalidate();
}

//放弃编辑的图形块退出图形块编辑状态的消息处理函数
void CDrawView::OnEditBlockCancel() 
{
	CDrawDoc* pDoc = GetDocument();
	pDoc->OnEditBlockCancel();		
//	InitVScroll();
//	InitHScroll();
	m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
	m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
	blc=p_Screen[pDoc->m_CurrentScreen].blc;
	m_DrawCurrent=0;
	DispStatus("请选择操作菜单");
	Invalidate();
}

//绘制图形块插入点的消息处理函数
void CDrawView::OnBlockInsert() 
{
	PushNumb=0;
	m_DrawCurrent=41;	//绘制插入图形块的插入点
	DispStatus("请用鼠标点中图例的插入点");
	::SetClassLong(GetSafeHwnd(), GCL_HCURSOR, (long)m_hcurCross);

}

//调用图形块管理对话框管理图形块,“图形块管理”菜单项的消息处理函数
void CDrawView::OnBlockDialog() 
{
	CDrawDoc* pDoc = GetDocument();
	int nn=pDoc->OnBlockDialog();		
	if(nn==2)		//增加新图形块
	{
		m_DrawCurrent=0;
		Invalidate();
	}
	else if(nn==3)	//修改既有图形块
	{
		m_DrawCurrent=0;
		

		//OnGraphAll();
	}
	if(nn==2||nn==3)	
	{
		m_DrawCurrent=0;
		m_xStart=p_Screen[pDoc->m_CurrentScreen].sx;
		m_yStart=p_Screen[pDoc->m_CurrentScreen].sy;
		blc=p_Screen[pDoc->m_CurrentScreen].blc;
		DispStatus("请选择操作菜单");
//		InitVScroll();
//		InitHScroll();
		Invalidate();
	}
}

//图象底图管理,“图象底图管理”菜单项的消息处理函数
void CDrawView::OnBasemapManage() 
{
	CDrawDoc* pDoc = GetDocument();
	CBasemapDlg pdlg1(pDoc);
	if(pdlg1.DoModal()==IDOK)
		Invalidate();
	
}


//按下鼠标左键时被调用,ON_WM_LBUTTONDOWN消息的映射函数
void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) 
{
    BOOL bSelect;
	float r;
    float xx1,yy1,xx2,yy2;
	int x1,x2,y1,y2,Lb,Index,pbh,id;
	BOOL m_Fill;
	CDrawDoc* pDoc = GetDocument();	//得到文档指针
    CClientDC ht(this);    
    if(m_DrawCurrent==1)	//如果正在绘制直线
	{
		if(PushNumb==0)		//如果是第一次按下左鼠标键
		{
			PushNumb++;			//做标记表示按下鼠标左键一次
			mPointOrign=point;	//直线的第一点等于点中点
			mPointOld=point;	//记录本次点中点
			SetCapture();		//捕捉鼠标输入
			DispStatus("请用鼠标点中直线的结束点");
		}
		else if(PushNumb==1) //第二次按下左鼠标键(即按下直线的结束点时)
		{
			//以下得到直线起终点的实际坐标
			VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1);
			VPtoDP(point.x,point.y,&xx2,&yy2);
			//增加一条直线并重新绘画此直线
			if(pDoc->m_DrawEdit==0)
				id=pDoc->GetGraphID(1);
			else
				id=0;
			pDoc->AddLine(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id,
				xx1,yy1,xx2,yy2)
				->Draw(&ht,0,0,m_bColor);
			PushNumb=0;		//鼠标按键次数为0,重新进行直线的绘制
			//以下是记录增加直线这一操作,供逆操作时用
			GraphUndo[0].Index=pDoc->GetGraphUpperBound(1);//得到此直线的序号
			GraphUndo[0].Lb=1;	//直线
			pDoc->AddUndo(2,1,GraphUndo);
			ReleaseCapture();
			DispStatus("请用鼠标点中直线的起始点");
		}
	}


	else if(m_DrawCurrent==2||m_DrawCurrent==3||m_DrawCurrent>=81&&m_DrawCurrent<=84)//正在绘制连续直线或者多边形区域
	{
		//将点的坐标存入Pointxy中
		PointXyz[PushNumb].x=m_xStart+blc*point.x;
		PointXyz[PushNumb].y=m_yStart+blc*(m_hScreen-point.y);
		PointXyz[PushNumb].z=0;
		if(PushNumb==0)      //如果是第一次按下左鼠标键
		{
			SetCapture();     //捕捉鼠标
			mPointOrign1=point;//第一个顶点为点中点
			mPointOrign=point;//原点等于点中点
			mPointOld=point;  //将前一个点设为点中点的坐标
		}
		else                 //二次以上按下鼠标左键时
		{
			mPointOrign=mPointOld; //将上一个点设为原点
			mPointOld=point;       //将点中点设为原点
		}
		PushNumb++;				//记录按下点的数目
	}

	
	else if(m_DrawCurrent==300)//正在绘制连续直线或者多边形区域
	{
		//将点的坐标存入Pointxy中
		PointPL[PushNumb].x=m_xStart+blc*point.x;
		PointPL[PushNumb].y=m_yStart+blc*(m_hScreen-point.y);
		PointPL[PushNumb].z=0;
		if(PushNumb==0)      //如果是第一次按下左鼠标键
		{
			SetCapture();     //捕捉鼠标
			mPointOrign1=point;//第一个顶点为点中点
			mPointOrign=point;//原点等于点中点
			mPointOld=point;  //将前一个点设为点中点的坐标
		}
		else                 //二次以上按下鼠标左键时
		{
			mPointOrign=mPointOld; //将上一个点设为原点
			mPointOld=point;       //将点中点设为原点
		}

⌨️ 快捷键说明

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