drawview.cpp

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

CPP
2,000 行
字号
		PushNumb++;				//记录按下点的数目
	}

	else if(m_DrawCurrent==4||m_DrawCurrent==5)  //如果正在绘制普通圆或者填充圆
	{
		if(PushNumb==0)			//如果是第一次按下左鼠标键
		{
			mPointOrign=point;	//原点等于点中点
			mPointOld=point;	//上一个点也等于点中点
			PushNumb++;
			SetCapture();		//捕捉鼠标
			DispStatus("请用鼠标点中圆的一个点");
		}
		else					//二次以上按下鼠标左键时
		{
			PushNumb=0;			//鼠标按键次数为0,重新进行直线的绘制
			//保存圆或填充圆
			x1=(int)sqrt(pow((float)(mPointOrign.x-mPointOld.x),2)+pow((float)(mPointOrign.y-mPointOld.y),2));
			r=VLtoDL(x1);
			VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1);
			if(m_DrawCurrent==4)	//如果是绘制一般圆
				m_Fill=0;
			else
				m_Fill=1;
			//保存圆并以覆盖模式重画圆
			if(pDoc->m_DrawEdit==0)
				id=pDoc->GetGraphID(3);
			else
				id=0;
			pDoc->AddCircle(m_pColor,m_brColor,m_LineWide,m_LineType,
				m_Layer,id,xx1,yy1,r,m_Fill)
				->Draw(&ht,0,0,m_bColor);
			ReleaseCapture();  //释放捕捉的鼠标 
			//以下是记录增加圆这一操作,供逆操作时用
			GraphUndo[0].Index=pDoc->GetGraphUpperBound(3);	//此圆的序号
			GraphUndo[0].Lb=3;	//类别是圆
			pDoc->AddUndo(2,1,GraphUndo);
			ReleaseCapture();
			DispStatus("请用鼠标点中圆的圆心");
		}
	}

	else if(m_DrawCurrent>=71&&m_DrawCurrent<=74)  //如果正在用圆来选择图形
	{
		bSelect=0;
		if(PushNumb==0)			//如果是第一次按下左鼠标键
		{
			mPointOrign=point;	//原点等于点中点
			mPointOld=point;	//上一个点也等于点中点
			PushNumb++;
			SetCapture();		//捕捉鼠标
			DispStatus("请用鼠标点中圆的一个点");
		}
		else					//二次以上按下鼠标左键时
		{
			PushNumb=0;			//鼠标按键次数为0,重新进行直线的绘制
			//保存圆或填充圆
			x1=(int)sqrt(pow((float)(mPointOrign.x-mPointOld.x),2)+pow((float)(mPointOrign.y-mPointOld.y),2));
			r=VLtoDL(x1);
			VPtoDP(mPointOrign.x,mPointOrign.y,&xx1,&yy1);
			m_pArc=new CArc(1,0,1,0,0,0,0,xx1,yy1,r,1,0,(float)pi*2);
			CDraw* pDraw;
			if(m_DrawCurrent==74)//如果是数据操作
			{
				pDoc->n_GraphSelect=0;
				for(int i=1;i<=2;i++)	//对2类图形元素循环
				{
				  int nn=pDoc->GetGraphUpperBound(i)+1;	//得到图形元素的数目	
				  while(nn-->pDoc->GraphNumbStart[i-1])	
				  {
					pDraw=pDoc->GetGraph(i,nn);
					if(pTree->m_PlSelType==1)
					{ 
						if(pDraw&&pDraw->IsCircleSelect(m_DrawCurrent-71,xx1-r,yy1-r,xx1+r,yy1+r,blc)&&pDraw->m_Layer==1)
						{
					            bSelect=1;
						        pDoc->AddSelectList(i,nn,pDraw->GetID());
						}
					}
					if(pTree->m_PlSelType==2)
					{ 
						if(pDraw&&pDraw->IsCircleSelect(m_DrawCurrent-71,xx1-r,yy1-r,xx1+r,yy1+r,blc)&&pDraw->m_Layer==2)
						{
					            bSelect=1;
						        pDoc->AddSelectList(i,nn,pDraw->GetID());
						}
					}
					if(pTree->m_PlSelType==3)
					{ 
						if(pDraw&&pDraw->IsCircleSelect(m_DrawCurrent-71,xx1-r,yy1-r,xx1+r,yy1+r,blc)&&pDraw->m_Layer==3)
						{
					            bSelect=1;
						        pDoc->AddSelectList(i,nn,pDraw->GetID());
						}
					}
				
				  }
				}
				pTree->ShowSelData();
			}
			else
			for(int i=1;i<=7;i++)	//对7类图形元素循环
			{
				int nn=pDoc->GetGraphUpperBound(i)+1;	//得到图形元素的数目	
				while(nn-->pDoc->GraphNumbStart[i-1])	
				{
					pDraw=pDoc->GetGraph(i,nn);
					if(pDraw&&pDraw->IsCircleSelect(m_DrawCurrent-70,xx1-r,yy1-r,xx1+r,yy1+r,blc))
					{
						bSelect=1;
						pDoc->AddSelectList(i,nn,pDraw->GetID());
					}
				}
			
			}
			delete m_pArc;
			PushNumb=0;
			DispStatus("请用鼠标点中圆的圆心");
			ReleaseCapture();  //释放捕捉的鼠标 
			//if(bSelect)
				Invalidate();
		}
	}

	else if(m_DrawCurrent==6)//正在绘制圆弧
	{
		if(PushNumb==0)			//第一次按下鼠标左键
		{
			SetCapture();
			DrawArcYes=0;
			mPointOrign1=point;	//记录圆弧第一点
			PushNumb++;
			DispStatus("请用鼠标点中圆弧的第二点");
		}
		else if(PushNumb==1)	//第二次按下鼠标左键
        {
			mPointOrign=point;	//记录下圆弧的第二点
			PushNumb++;
			DispStatus("请用鼠标点中圆弧的第三点");
		}
		else					//第三次按下鼠标键
		{
			//计算圆弧的特征参数
			jsarc(mPointOrign1,mPointOrign,point,&m_CircleX,&m_CircleY,
				&m_CircleR,&m_Angle1,&m_Angle2);
			//增加一个圆弧并重新绘制圆弧
			
			if(pDoc->m_DrawEdit==0)
				id=pDoc->GetGraphID(4);
			else
				id=0;
			pDoc->AddArc(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,id,
				m_CircleX,m_CircleY,m_CircleR,0,m_Angle1,m_Angle2)
				->Draw(&ht,0,0,m_bColor);
			PushNumb=0;         ////鼠标按键次数为0,重新进行圆弧的绘制
			ReleaseCapture();   //释放捕捉的鼠标
			//以下是记录增加圆弧这一操作,供逆操作时用
			GraphUndo[0].Index=pDoc->GetGraphUpperBound(4);	//此圆弧的序号
			GraphUndo[0].Lb=4;	//类别是圆弧
			pDoc->AddUndo(2,1,GraphUndo);
			ReleaseCapture();
			DispStatus("请用鼠标点中圆弧的起始点");
		}
	}
	else if(m_DrawCurrent==7)	//进行标注文字的操作
	{
		VPtoDP(point.x,point.y,&m_TextX,&m_TextY);
		if(!pTextDlg)	//如果标注文字对话框不存在,产生对话框
		{
			//初始画形成一个标注文字对话框
			pTextDlg=new TextWriteDlg(this,m_TextString,m_FontHeight,m_FontWide,
				m_TextAngle,m_FontAngle,m_FontBetween);
			ASSERT(pTextDlg);
		}
		if(!(pTextDlg->m_hWnd))	//如果对话框没有打开
		{
			pTextDlg->Create(ID_WRITE_TEXT,this);
		}
		if(!(pTextDlg->IsVisible()))//如果对话框当前不可见
		{
			pTextDlg->ShowWindow(SW_SHOW);	//使标注文字对话框可见
		}
	}
	else if(m_DrawCurrent==8) //正在绘制图例
	{
		if(PushNumb==0)
		{
			mPointOrign=point;
			mPointOld=point;
			PushNumb++;
			DispStatus("请用鼠标点中图例高度的结束点");
		}
		else if(PushNumb==1)	//第二次按下左键
		{
			ht.SetROP2(R2_NOT);
			ht.MoveTo(mPointOrign);
			ht.LineTo(mPointOld);
			xx1=VLtoDL(mPointOrign.y-point.y);
			y_Scale=xx1/pBlock->GetHeight();
			if(y_Scale<0)
				y_Scale=-y_Scale;
			x_Scale=y_Scale;
			VPtoDP(point.x,point.y,&xx1,&yy1);
			pBlock->Draw(&ht,xx1,yy1,x_Scale,y_Scale,1,0);
			PushNumb++;
			DispStatus("请用鼠标点中图例的插入点");
		}
		else if(PushNumb==2)	//第三次按下鼠标左键
		{ 
			VPtoDP(point.x,point.y,&xx1,&yy1);
			if(pDoc->m_DrawEdit==0)
				id=pDoc->GetGraphID(6);
			else
				id=0;
			pDoc->AddTag(m_pColor,m_brColor,m_LineWide,m_LineType,m_Layer,xx1,yy1,x_Scale,y_Scale,id,pBlock)
				->Draw(&ht,0,0,0);
			PushNumb=0;         //完成操作,左键按下数置0
			GraphUndo[0].Index=pDoc->GetGraphUpperBound(6);	//此圆弧的序号
			GraphUndo[0].Lb=6;	//类别是圆弧
			pDoc->AddUndo(2,1,GraphUndo);
			ReleaseCapture();   //释放捕捉的鼠标
			DispStatus("请用鼠标点中图例高度的起点");
		}
	}

	else if(m_DrawCurrent==12)//图形移动
	{   	
		if(PushNumb==0)
		{
		DispStatus("请用鼠标拖动至移动的结束点");
		mPointOrign=point; //原点等于点中点
		mPointOld=point; //上一个点等于点中点
	
        SetCapture(); 
		}
	/*	else if(PushNumb==1)
		{
			m_xStart=m_xStart-blc*(point.x-mPointOrign.x);
			m_yStart=m_yStart-blc*(point.y-mPointOrign.y);
		}*/

    }

	else if(m_DrawCurrent==11||m_DrawCurrent==50) //正在进行图形放大
    {   
		if(PushNumb==0) //如果第一次按下鼠标左键
        {
			if(m_DrawCurrent==11)
				DispStatus("请用鼠标点中放大窗口的另一顶点");
			else if(m_DrawCurrent==50)
				DispStatus("请用鼠标点中对象插入区域的另一顶点");
			mPointOrign=point; //原点等于点中点
			mPointOld=point;   //上一个点等于点中点
			PushNumb++;        //按键数增加1
			SetCapture();      //捕捉鼠标
		}
		else if(PushNumb==1)//第二次按下左键
		{
			if(m_DrawCurrent==11)  //图形放大
			{
				//得到左下点和右上点
				x1=min(mPointOrign.x,point.x);
				y1=max(mPointOrign.y,point.y);
				x2=max(mPointOrign.x,point.x);
				y2=min(mPointOrign.y,point.y); 
				//改变原点的坐标
				VPtoDP(x1,y1,&m_xStart,&m_yStart);
				//改变比例
				float bl1=(float)m_wScreen/(float)(x2-x1); //横向放大比例
				float bl2=(float)m_hScreen/(float)(y1-y2); //纵向放大比例
				if(bl2<bl1)
					bl1=bl2;		//取较小的变化比例
				if(bl1>0)   
					blc=blc/bl1;	//改变显示比例
				pDoc->AddScreen(m_xStart,m_yStart,blc);	//保存本屏的参数
//				InitVScroll();
//				InitHScroll();
				Invalidate();			//使图形重画
			}
		
			else if(m_DrawCurrent==50)	//如果是插入OLE对象操作
			{
				//得到左下点和右上点
				x1=min(mPointOrign.x,point.x);
				y1=max(mPointOrign.y,point.y);
				x2=max(mPointOrign.x,point.x);
				y2=min(mPointOrign.y,point.y); 
				COleInsertDialog dlg;
				if (dlg.DoModal() != IDOK)
					return;
				BeginWaitCursor();
				CDrawCntrItem* pItem = NULL;
				TRY
				{
					pItem = new CDrawCntrItem(pDoc);
					ASSERT_VALID(pItem);
					if (!dlg.CreateItem(pItem))
						AfxThrowMemoryException();  // any exception will do
					ASSERT_VALID(pItem);

					if (dlg.GetSelectionType()==COleInsertDialog::createNewItem)
						pItem->DoVerb(OLEIVERB_SHOW, this);
					ASSERT_VALID(pItem);
					m_pSelection = pItem;   // set selection to last inserted item
					VPtoDP(x1,y1,&pItem->m_X1,&pItem->m_Y1);
					VPtoDP(x2,y2,&pItem->m_X2,&pItem->m_Y2);
					pDoc->UpdateAllViews(NULL);
				}
				CATCH(CException, e)
				{
					if (pItem != NULL)
					{
						ASSERT_VALID(pItem);
						pItem->Delete();
					}
					AfxMessageBox(IDP_FAILED_TO_CREATE);
				}
				END_CATCH
				EndWaitCursor();
			}
			if(m_DrawCurrent==11)
				DispStatus("请用鼠标点中放大窗口的一个顶点");
			else if(m_DrawCurrent==12)
				DispStatus("请用鼠标点中移动的基点");
			else if(m_DrawCurrent==50)
			{
				DispStatus("请选择操作菜单");
				m_DrawCurrent=0;		//完成一次后,不继续运行此功能
			}
			PushNumb=0;					//完成操作,左键按下数置0
			ReleaseCapture();			//释放捕捉的鼠标
		}
    }

	else if(m_DrawCurrent==13)
	{
		VPtoDP(point.x,point.y,&xx1,&yy1);
		blc*=(float)1.3;
	    m_xStart=xx1-blc*(point.x);
		m_yStart=yy1-blc*(m_hScreen-point.y);
		pDoc->AddScreen(m_xStart,m_yStart,blc);
//		InitVScroll();
//		InitHScroll();
		Invalidate();			//使图形重画
		
	}
	
	else if(m_DrawCurrent==61||m_DrawCurrent==62||m_DrawCurrent==63) //正在进行窗口选择图形元素操作
    {
		bSelect=0;
		if(PushNumb==0) //如果第一次按下鼠标左键
        {
			DispStatus("请用鼠标点中选择窗口的另一顶点");
			mPointOrign=point; //原点等于点中点
			mPointOld=point;   //上一个点等于点中点
			PushNumb++;        //按键数增加1
			SetCapture();      //捕捉鼠标
		}
		else if(PushNumb==1)//第二次按下左键
		{
			//得到左下点和右上点
			x1=min(mPointOrign.x,point.x);
			y1=max(mPointOrign.y,point.y);
			x2=max(mPointOrign.x,point.x);
			y2=min(mPointOrign.y,point.y); 
			VPtoDP(x1,y1,&xx1,&yy1);
			VPtoDP(x2,y2,&xx2,&yy2);
			PointXyz[0].x=xx1;
			PointXyz[0].y=yy1;
			PointXyz[1].x=xx1;
			PointXyz[1].y=yy2;
			PointXyz[2].x=xx2;
			PointXyz[2].y=yy2;
			PointXyz[3].x=xx2;
			PointXyz[3].y=yy1;
			PointXyz[4].x=xx1;
			PointXyz[4].y=yy1;
			m_pPline=new CPline(1,1,1,0,0,0,0,5,PointXyz,0);
			CDraw* pDraw;			
			for(int i=1;i<=7;i++)	//对7类图形元素循环
			{
				int nn=pDoc->GetGraphUpperBound(i)+1;	//得到图形元素的数目	
				while(nn-->pDoc->GraphNumbStart[i-1])	
				{
					pDraw=pDoc->GetGraph(i,nn);
					if(pDraw&&pDraw->IsRgnSelect(m_DrawCurrent-60,xx1,yy1,xx2,yy2,1))
					{
						bSelect=1;
						pDoc->AddSelectList(i,nn,pDraw->GetID());
					}
				}
			}
			delete m_pPline;
			DispStatus("请用鼠标点中选择窗口的一个顶点");
			PushNumb=0;					//完成操作,左键按下数置0
			if(bSelect)	//如果选中了图形元素
				Invalidate();
			ReleaseCapture();			//释放捕捉的鼠标
		}
    }

⌨️ 快捷键说明

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