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

📄 drawsysview.cpp

📁 一个用C++写的简易绘图工具
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		lTemp.pStart=m_startPoint;
		lTemp.pEnd=point;
		m_listAllLine.push_back(lTemp);
		if(m_dsDrawSort==DsManyBd)
			m_startPoint=point;

		SetCursor(m_hDLCursor);
		break;

	case DsCircle:
		r=GetDist(m_startPoint,point);
		Circle(m_startPoint,r,pDC);
		
		cTemp.pMid=m_startPoint;
		cTemp.r=r;
		m_listAllCircle.push_back(cTemp);

		pDC->SetROP2(R2_NOTXORPEN);
		Line(m_startPoint,point,pDC);

		SetCursor(m_hDCCursor);
		break;

	case DsCutLine:
		rect.left=m_startPoint.x;
		rect.top=m_startPoint.y;
		rect.right=point.x;
		rect.bottom=point.y;
		while(pLine!=m_listAllLine.end())
		{
			CutLine(rect,*pLine);
			if(!(*pLine).pStart.x && !(*pLine).pStart.y && !(*pLine).pEnd.x && !(*pLine).pEnd.y)
			{
				pTemp=pLine;
				pTemp++;
				m_listAllLine.remove(*pLine);
				pLine=pTemp;
			}
			else
				pLine++;
		}
		GetClientRect(&rect);
		InvalidateRect(&rect,1);

		SetCursor(m_hCLCursor);
		break;

	case DsBezier:
		Bezier(m_vectorCurBezier,pDC);

		m_vectorCurBezier.pop_back();
		m_vectorCurBezier.push_back(point);
		Bezier(m_vectorCurBezier,pDC);

		SetCursor(m_hDBCursor);
		break;

	case DsText:
		SetCursor(m_hDTCursor);
		break;

	case DsStroke:
		SetCursor(m_hDSCursor);
		break;
	}

	CView::OnLButtonUp(nFlags, point);
}

void CDrawSysView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CString str;
	CDC *pDC=GetDC();

	str.Format("X:%d,Y:%d",point.x,point.y);
	if(!m_pwndStatusBar)
		m_pwndStatusBar=((CMainFrame*)AfxGetMainWnd())->GetStatusBar();
	m_pwndStatusBar->SetPaneText(1,str,1);

	if(m_dsDrawSort==DsNull)
		return;
	
	switch(m_dsDrawSort)
	{
	case DsLine:
	case DsManyBd:
		SetCursor(m_hDLCursor);
		break;

	case DsCircle:
		SetCursor(m_hDCCursor);
		break;

	case DsCutLine:
		SetCursor(m_hCLCursor);
		break;

	case DsBezier:
		SetCursor(m_hDBCursor);
		break;

	case DsText:
		SetCursor(m_hDTCursor);
		break;

	case DsStroke:
		SetCursor(m_hDSCursor);
		break;
	}

	if(!m_bIsMouseDown)
		return;

	CPen pen;
	CRect rect;
	list<LINE>::iterator p=m_listAllLine.end();
	vector<POINT>::iterator pVector=m_vectorCurBezier.end();

	pDC->SetROP2(R2_NOTXORPEN);

	switch(m_dsDrawSort)
	{
	case DsManyBd:
		p--;
		if((*p).pStart.x==m_startPoint.x && (*p).pStart.y==m_startPoint.y)		
			m_listAllLine.pop_back();
		if(!m_bIsFirstDone)
			m_spManyBd=m_startPoint;
		m_bIsFirstDone=1;

	case DsLine:
		Line(m_startPoint,m_endPoint,pDC);
		Line(m_startPoint,point,pDC);
		break;

	case DsCircle:
		Line(m_startPoint,m_endPoint,pDC);
		Line(m_startPoint,point,pDC);

		Circle(m_startPoint,GetDist(m_startPoint,m_endPoint),pDC);
		Circle(m_startPoint,GetDist(m_startPoint,point),pDC);
		break;

	case DsCutLine:
		pen.CreatePen(PS_DOT,m_iPenWidth,m_lPenColor);
		pDC->SelectObject(&pen);
		pDC->Rectangle(&CRect(m_startPoint,m_endPoint));
		pDC->Rectangle(&CRect(m_startPoint,point));
		break;

	case DsBezier:
		Bezier(m_vectorCurBezier,pDC);

		m_vectorCurBezier.pop_back();
		m_vectorCurBezier.push_back(point);
		Bezier(m_vectorCurBezier,pDC);
		break;

	case DsStroke:
		pen.CreatePen(PS_SOLID,m_iPenWidth,m_lPenColor);
		pDC->SelectObject(&pen);
		pDC->MoveTo(m_endPoint);
		pDC->LineTo(point);
		break;
	}

	m_endPoint=point;

	CView::OnMouseMove(nFlags, point);
}

void CDrawSysView::Circle(POINT pc, int r,CDC *pDC)
{
	int x,y;
	float p;

	pDC->SetViewportOrg(pc);

	x=0;
	y=r;
	p=1.25-r;
	while(x<=y+1)
	{
		//第1象限
		pDC->SetPixel(x,y,m_lPenColor);
		pDC->SetPixel(y,x,m_lPenColor);
		//第2象限
		pDC->SetPixel(-x,y,m_lPenColor);
		pDC->SetPixel(-y,x,m_lPenColor);
		//第3象限
		pDC->SetPixel(-y,-x,m_lPenColor);
		pDC->SetPixel(-x,-y,m_lPenColor);
		//第4象限
		pDC->SetPixel(x,-y,m_lPenColor);
		pDC->SetPixel(y,-x,m_lPenColor);
		
		x++;
		if(p>=0)
		{
			y--;
			p+=2*x+1-2*y;
		}
		else
			p+=2*x+1;
	}

	pDC->SetViewportOrg(0,0);
}

int CDrawSysView::GetDist(POINT p1, POINT p2)
{
	return pow(pow(p1.y-p2.y,2)+pow(p1.x-p2.x,2),1.0/2);
}

void CDrawSysView::OnDda() 
{
	// TODO: Add your command handler code here
	m_dlsDrawLSort=DlsDDA;
}

void CDrawSysView::OnBresenham() 
{
	// TODO: Add your command handler code here
	m_dlsDrawLSort=DlsBresenham;
}

void CDrawSysView::OnSet()
{
	// TODO: Add your command handler code here
	if(m_SetDlg.DoModal()==IDOK)
	{
		m_iPenWidth=m_SetDlg.GetPenWidth();
		m_lPenColor=m_SetDlg.GetPenColor();
		m_lBkColor=m_SetDlg.GetBkColor();
		m_lFillColor=m_SetDlg.GetFillColor();
		m_dlsDrawLSort=m_SetDlg.GetDrawLSort();

		CDC *pDC=GetDC();
		CPen Pen;

		pDC->SetBkColor(m_lBkColor);
		Pen.CreatePen(PS_SOLID,m_iPenWidth,m_lPenColor);
		pDC->SelectObject(&Pen);
	}
}

void CDrawSysView::OnManybd() 
{
	// TODO: Add your command handler code here
	if(m_dsDrawSort!=DsManyBd)
	{
		TEXT tTemp;
		int nSize;
		CDC *pDC=GetDC();

		switch(m_dsDrawSort)
		{
		case DsBezier:
			m_listBezier.push_back(m_vectorCurBezier);
			m_vectorCurBezier.clear();
			break;

		case DsText:
			m_edtTextIn.GetWindowText(tTemp.str);
			if(tTemp.str!="")
			{
				m_startPoint.y-=7;
				tTemp.p=m_startPoint;
				m_vectorText.push_back(tTemp);
			}
			m_edtTextIn.ShowWindow(0);
			m_edtTextIn.SetWindowText("");
			
			nSize=m_vectorText.size();
			if(nSize>0)
				pDC->TextOut(m_vectorText[nSize-1].p.x,m_vectorText[nSize-1].p.y,m_vectorText[nSize-1].str);
			
			break;
		}

		m_dsDrawSort=DsManyBd;
	}
	else
	{
		if(m_bIsFirstDone)
		{
			CDC *pDC=GetDC();
			LINE lTemp;
			
			Line(m_startPoint,m_spManyBd,pDC);
			lTemp.pStart=m_startPoint;
			lTemp.pEnd=m_spManyBd;
			m_listAllLine.push_back(lTemp);
		}
		
		m_dsDrawSort=DsNull;
	}

	m_bIsFirstDone=0;
	m_bIsMouseDown=0;
}

void CDrawSysView::OnUpdateManybd(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_dsDrawSort==DsManyBd);
}

void CDrawSysView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_dsDrawSort==DsNull)
		return;

	switch(m_dsDrawSort)
	{
	case DsLine:
	case DsManyBd:
		SetCursor(m_hDLCursor);
		break;

	case DsCircle:
		SetCursor(m_hDCCursor);
		break;

	case DsCutLine:
		SetCursor(m_hCLCursor);
		break;

	case DsBezier:
		SetCursor(m_hDBCursor);
		break;

	case DsText:
		SetCursor(m_hDTCursor);
		break;

	case DsStroke:
		SetCursor(m_hDSCursor);
		break;
	}

	CView::OnLButtonDblClk(nFlags, point);
}

void CDrawSysView::OnCut() 
{
	// TODO: Add your command handler code here
	if(m_dsDrawSort!=DsCutLine)
	{
		TEXT tTemp;
		int nSize;
		CDC *pDC=GetDC();

		switch(m_dsDrawSort)
		{
		case DsManyBd:
			if(m_bIsFirstDone)
			{
				CDC *pDC=GetDC();
				LINE lTemp;
				
				Line(m_startPoint,m_spManyBd,pDC);
				lTemp.pStart=m_startPoint;
				lTemp.pEnd=m_spManyBd;
				m_listAllLine.push_back(lTemp);
			}
			break;

		case DsBezier:
			m_listBezier.push_back(m_vectorCurBezier);
			m_vectorCurBezier.clear();
			break;

		case DsText:
			m_edtTextIn.GetWindowText(tTemp.str);
			if(tTemp.str!="")
			{
				m_startPoint.y-=7;
				tTemp.p=m_startPoint;
				m_vectorText.push_back(tTemp);
			}
			m_edtTextIn.ShowWindow(0);
			m_edtTextIn.SetWindowText("");
			
			nSize=m_vectorText.size();
			if(nSize>0)
				pDC->TextOut(m_vectorText[nSize-1].p.x,m_vectorText[nSize-1].p.y,m_vectorText[nSize-1].str);
			
			break;
		}

		m_dsDrawSort=DsCutLine;
	}
	else
		m_dsDrawSort=DsNull;

	m_bIsFirstDone=0;
	m_bIsMouseDown=0;
}

void CDrawSysView::OnUpdateCut(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_dsDrawSort==DsCutLine);
}

void CDrawSysView::CutLine(RECT rect,POINT& p1, POINT& p2)
{
	//说明:此坐标为设备坐标
	int iRgnCode1=0;
	int iRgnCode2=0;
	int temp;
	POINT ptTemp;

	//使p1在前面
	if(p1.x>p2.x)
	{
		ptTemp=p1;
		p1=p2;
		p2=ptTemp;
	}

	//使bottom比top大,right比left大
	if(rect.bottom<rect.top)
	{
		temp=rect.bottom;
		rect.bottom=rect.top;
		rect.top=temp;
	}
	if(rect.right<rect.left)
	{
		temp=rect.right;
		rect.right=rect.left;
		rect.left=temp;
	}

	//----------求p1和p2的区域码----------
	if(p1.x<rect.left)
		iRgnCode1+=1;
	if(p1.x>rect.right)
		iRgnCode1+=1<<1;
	if(p1.y>rect.bottom)
		iRgnCode1+=1<<2;
	if(p1.y<rect.top)
		iRgnCode1+=1<<3;

	if(p2.x<rect.left)
		iRgnCode2+=1;
	if(p2.x>rect.right)
		iRgnCode2+=1<<1;
	if(p2.y>rect.bottom)
		iRgnCode2+=1<<2;
	if(p2.y<rect.top)
		iRgnCode2+=1<<3;
	//------------------------------------

	//被裁剪的线段在矩形内
	if(!iRgnCode1 && !iRgnCode2)
		return;

	//被裁剪的线段在矩形外
	if((iRgnCode1 & iRgnCode2)!=0 && (iRgnCode1 || iRgnCode2))
	{
		p1.x=p2.x=0;
		p1.y=p2.y=0;
		return;
	}

	//竖线
	if(p1.x==p2.x)
	{
		if(p1.y>p2.y)
		{
			temp=p1.y;
			p1.y=p2.y;
			p2.y=temp;
		}
		if(p1.y<rect.top)
		{
			p1.y=rect.top;
			if(p2.y>rect.bottom)
				p2.y=rect.bottom;

			return;
		}
		p2.y=rect.bottom;

		return;
	}

	//横线
	if(p1.y==p2.y)
	{
		if(p1.x<rect.left)
		{
			p1.x=rect.left;
			if(p2.x>rect.right)
				p2.x=rect.right;

			return;
		}
		p2.x=rect.right;

		return;
	}

	//斜线
	float m=(p2.y-p1.y)*1.0/(p2.x-p1.x);

	//---------------p1在矩形内,p2在矩形外---------------
	if(!iRgnCode1)
	{
		if(m<0)
		{
			p2.y=p1.y+(rect.right-p1.x)*m;
			if(p2.y>rect.top)
			{
				p2.x=rect.right;
				return;
			}

			p2.y=rect.top;
			p2.x=(p2.y-p1.y)/m+p1.x;
			return;
		}

		p2.y=p1.y+(rect.right-p1.x)*m;
		if(p2.y<rect.bottom)
		{
			p2.x=rect.right;
			return;
		}
		
		p2.y=rect.bottom;
		p2.x=(p2.y-p1.y)/m+p1.x;
		return;
	}
	//---------------------------------------------------

	//---------------p1在矩形外,p2在矩形内---------------
	if(!iRgnCode2)
	{
		if(m<0)
		{
			p1.y=p2.y-m*(p2.x-rect.left);
			if(p1.y<rect.bottom)
			{
				p1.x=rect.left;
				return;
			}
			p1.y=rect.bottom;
			p1.x=p2.x-(p2.y-p1.y)/m;
			return;
		}

		p1.y=p2.y-m*(p2.x-rect.left);
		if(p1.y>rect.top)
		{
			p1.x=rect.left;
			return;
		}
		p1.y=rect.top;
		p1.x=p2.x-(p2.y-p1.y)/m;
		return;
	}
	//---------------------------------------------------

	//---------------两点都在矩形外---------------
	//iRgnCode1==9 || 1 || 5
	if(p1.x<rect.left)
	{
		if(iRgnCode1==9)
		{
			if(m<0)
			{
				p1.x=p2.x=0;
				p1.y=p2.y=0;
				return;
			}
			temp=p1.x+(rect.top-p1.y)/m;
			if(temp>rect.right)
			{
				p1.x=p2.x=0;
				p1.y=p2.y=0;
				return;
			}
			if(temp>rect.left)
			{
				p1.x=temp;
				p1.y=rect.top;
				p2.x=rect.right;
				p2.y=p1.y+(p2.x-p1.x)*m;
				if(p2.y<rect.bottom)
					return;

				p2.y=rect.bottom;
				p2.x=p1.x+(p2.y-p1.y)/m;

				return;
			}
			p1.y+=(rect.left-p1.x)*m;
			if(p1.y>rect.bottom)
			{
				p1.x=p2.x=0;
				p1.y=p2.y=0;
				return;
			}
			p1.x=rect.left;
			p2.y=rect.bottom;
			p2.x=p1.x+(p2.y-p1.y)/m;
			if(p2.x<rect.right)
				return;
			p2.x=rect.right;
			p2.y=p1.y+(p2.x-p1.x)*m;

			return;
		}

		if(iRgnCode1==1)
		{
			if(m<0)
			{
				p1.y+=(rect.left-p1.x)*m;
				if(p1.y<rect.top)
				{
					p1.x=p2.x=0;
					p1.y=p2.y=0;
					return;
				}
				p1.x=rect.left;
				p2.x=p1.x+(rect.top-p1.y)/m;
				if(p2.x>rect.right)
				{
					p2.x=rect.right;
					p2.y=p1.y+(p2.x-p1.x)*m;
					return;
				}
				p2.y=rect.top;
				return;
			}
			
			p1.y+=(rect.left-p1.x)*m;
			if(p1.y>rect.bottom)
			{
				p1.x=p2.x=0;
				p1.y=p2.y=0;
				return;
			}
			p1.x=rect.left;
			p2.x=p1.x+(rect.bottom-p1.y)/m;
			if(p2.x>rect.right)
			{
				p2.x=rect.right;
				p2.y=p1.y+(p2.x-p1.x)*m;
				return;
			}
			p2.y=rect.bottom;
			
			return;
		}

		//iRgnCode1==5
		if(m>0)
		{
			p1.x=p2.x=0;
			p1.y=p2.y=0;
			return;
		}
		temp=p1.x+(rect.bottom-p1.y)/m;
		if(temp>rect.right)
		{
			p1.x=p2.x=0;
			p1.y=p2.y=0;
			return;
		}
		if(temp>rect.left)
		{
			p1.x=temp;
			p1.y=rect.bottom;
			p2.x=rect.right;
			p2.y=p1.y+(p2.x-p1.x)*m;
			if(p2.y>rect.top)
				return;
			
			p2.y=rect.top;
			p2.x=p1.x+(p2.y-p1.y)/m;
			
			return;
		}
		p1.y+=(rect.left-p1.x)*m;
		if(p1.y<rect.top)
		{

⌨️ 快捷键说明

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