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

📄 drawsysview.cpp

📁 一个用C++写的简易绘图工具
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			p1.x=p2.x=0;
			p1.y=p2.y=0;
			return;
		}
		p1.x=rect.left;
		p2.y=rect.top;
		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;
	}

	//iRgnCode1==8 || 4
	if(m<0)
	{
		//iRgnCode1==8
		if(p1.y<rect.top)
		{
			p1.x=p2.x=0;
			p1.y=p2.y=0;
			return;
		}
		
		//iRgnCode1==4
		p1.x+=(rect.bottom-p1.y)/m;
		if(p1.x>rect.right)
		{
			p1.x=p2.x=0;
			p1.y=p2.y=0;
			return;
		}
		p1.y=rect.bottom;
		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=p1.x+(p2.y-p1.y)/m;
		
		return;
	}
	
	if(p1.y>rect.bottom)
	{
		p1.x=p2.x=0;
		p1.y=p2.y=0;
		return;
	}
	
	p1.x+=(rect.top-p1.y)/m;
	if(p1.x>rect.right)
	{
		p1.x=p2.x=0;
		p1.y=p2.y=0;
		return;
	}
	p1.y=rect.top;
	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=p1.x+(p2.y-p1.y)/m;
	//--------------------------------------------
}

void CDrawSysView::CutLine(RECT rect, LINE &l)
{
	POINT p1,p2;

	p1=l.pStart;
	p2=l.pEnd;
	CutLine(rect,p1,p2);
	l.pStart=p1;
	l.pEnd=p2;
}

void CDrawSysView::Bezier(vector<POINT> vectorPoint,CDC *pDC)
{
	int n=vectorPoint.size()-1;
	int i,r;
	float u;
	POINT *p=new POINT[n+1];
	vector<POINT> vectorBPoint;
	CPen pen;

	for(u=0;u<=1;u+=0.0005)
	{
		for(i=0;i<=n;i++)
			p[i]=vectorPoint[i];
		for(r=1;r<=n;r++)
		{
			for(i=0;i<=n-r;i++)
			{
				p[i].x=(1-u)*p[i].x+u*p[i+1].x;
				p[i].y=(1-u)*p[i].y+u*p[i+1].y;
			}
		}

		vectorBPoint.push_back(p[0]);
	}

	pen.CreatePen(PS_SOLID,m_iPenWidth,m_lPenColor);
	pDC->SelectObject(&pen);
	n=vectorBPoint.size();
	for(i=1;i<n;i++)
	{
		pDC->MoveTo(vectorBPoint[i-1]);
		pDC->LineTo(vectorBPoint[i]);
	}
}

void CDrawSysView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	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::OnRButtonDown(nFlags, point);
}

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

	switch(m_dsDrawSort)
	{
	case DsManyBd:	
		Line(m_startPoint,m_spManyBd,pDC);

		lTemp.pStart=m_startPoint;
		lTemp.pEnd=m_spManyBd;
		m_listAllLine.push_back(lTemp);

		m_bIsFirstDone=0;

	case DsLine:
		SetCursor(m_hDLCursor);
		break;

	case DsCircle:
		SetCursor(m_hDCCursor);
		break;

	case DsCutLine:
		SetCursor(m_hCLCursor);
		break;

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

		SetCursor(m_hDBCursor);
		break;

	case DsText:
		SetCursor(m_hDTCursor);
		break;

	case DsStroke:
		SetCursor(m_hDSCursor);
		break;
	}

	CView::OnRButtonUp(nFlags, point);
}

void CDrawSysView::OnRButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	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::OnRButtonDblClk(nFlags, point);
}

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

		switch(m_dsDrawSort)
		{
		case DsManyBd:
			if(m_bIsFirstDone)
			{
				LINE lTemp;
				
				Line(m_startPoint,m_spManyBd,pDC);
				lTemp.pStart=m_startPoint;
				lTemp.pEnd=m_spManyBd;
				m_listAllLine.push_back(lTemp);
			}
			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=DsBezier;
	}
	else
	{
		m_listBezier.push_back(m_vectorCurBezier);
		m_vectorCurBezier.clear();

		m_dsDrawSort=DsNull;
	}

	m_bIsFirstDone=0;
	m_bIsMouseDown=0;
}

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

void CDrawSysView::OnText() 
{
	// TODO: Add your command handler code here
	CDC *pDC=GetDC();

	if(m_dsDrawSort!=DsText)
	{
		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;
		}

		m_dsDrawSort=DsText;
	}
	else
	{
		TEXT tTemp;
		int nSize;

		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);

		m_dsDrawSort=DsNull;
	}

	m_bIsFirstDone=0;
	m_bIsMouseDown=0;
}

void CDrawSysView::OnClear() 
{
	// TODO: Add your command handler code here
	CRect rect;

	m_listAllLine.clear();
	m_listAllCircle.clear();
	m_listBezier.clear();
	m_vectorText.clear();
	
	GetClientRect(&rect);
	InvalidateRect(&rect,1);
}

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

		switch(m_dsDrawSort)
		{
		case DsManyBd:
			if(m_bIsFirstDone)
			{
				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=DsStroke;
	}
	else
		m_dsDrawSort=DsNull;

	m_bIsFirstDone=0;
	m_bIsMouseDown=0;
}

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

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

void CDrawSysView::OnTest() 
{
	// TODO: Add your command handler code here
	CDC *pDC=GetDC();
	int i;
	long temp=m_lPenColor;
	CBrush brush;
	CRect rect;
	int nScreenWidth;
	int nScreenHight;
	TEXT tTemp;
	int nSize;
	
	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=DsNull;

	brush.CreateSolidBrush(RGB(255,255,255));
	GetClientRect(&rect);
	pDC->FillRect(&rect,&brush);
	brush.DeleteObject();

	nScreenWidth=rect.right;
	nScreenHight=rect.bottom;
//	for(i=5;i<=505;i++)
//	{
//		m_lPenColor=RGB(255,0,i*255/550);
//		Line(255,320,i,70,pDC);
//	}
//	for(i=5;i<=505;i++)
//	{
//		m_lPenColor=RGB(i*255/550,255,0);
//		Line(255,320,i,570,pDC);
//	}
//	for(i=70;i<570;i++)
//	{
//		m_lPenColor=RGB(0,255,i*255/650);
//		Line(255,320,5,i,pDC);
//	}
//	for(i=70;i<570;i++)
//	{
//		m_lPenColor=RGB(0,i*255/650,255);
//		Line(255,320,505,i,pDC);
//	}
//
//	for(int r=0;r<=250;r++)
//	{
//		m_lPenColor=RGB(0,255-r,255+r);
//		Circle(760,320,r,pDC);
//	}

	for(i=5;i<=nScreenWidth/2+5;i++)
	{
		m_lPenColor=RGB(255,0,i*255/550);
		Line(nScreenWidth/4+5,nScreenHight/2,i,nScreenHight/2-nScreenWidth/4,pDC);
	}
	for(i=5;i<=nScreenWidth/2+5;i++)
	{
		m_lPenColor=RGB(i*255/550,255,0);
		Line(nScreenWidth/4+5,nScreenHight/2,i,nScreenHight/2+nScreenWidth/4,pDC);
	}
	for(i=nScreenHight/2-nScreenWidth/4;i<nScreenHight/2+nScreenWidth/4;i++)
	{
		m_lPenColor=RGB(0,255,i*255/650);
		Line(nScreenWidth/4+5,nScreenHight/2,5,i,pDC);
	}
	for(i=nScreenHight/2-nScreenWidth/4;i<nScreenHight/2+nScreenWidth/4;i++)
	{
		m_lPenColor=RGB(0,i*255/650,255);
		Line(nScreenWidth/4+5,nScreenHight/2,nScreenWidth/2+5,i,pDC);
	}

	for(int r=0;r<=nScreenWidth/4-5;r++)
	{
		m_lPenColor=RGB(0,255-r,255+r);
		Circle(nScreenWidth*0.75+5,nScreenHight/2,r,pDC);
	}

	ReleaseDC(pDC);
}

void CDrawSysView::Line(POINT p1, POINT p2, CDC *pDC)
{
	if(m_dlsDrawLSort==DlsDDA)
		Line_DDA(p1,p2,pDC);
	else
		Line_Bresenham(p1,p2,pDC);
}

void CDrawSysView::Line(long p1x, long p1y, long p2x, long p2y, CDC *pDC)
{
	POINT p1,p2;

	p1.x=p1x;
	p1.y=p1y;

	p2.x=p2x;
	p2.y=p2y;

	Line(p1,p2,pDC);
}

void CDrawSysView::Circle(long pcx, long pcy, int r, CDC *pDC)
{
	POINT pc;

	pc.x=pcx;
	pc.y=pcy;

	Circle(pc,r,pDC);
}

void CDrawSysView::OnRandline() 
{
	// TODO: Add your command handler code here
	CDC *pDC=GetDC();
	CRect rect;
	int i;
	LINE lTemp;
	TEXT tTemp;
	int nSize;
	
	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=DsNull;

	srand(time(0));
	GetClientRect(&rect);

	for(i=0;i<500;i++)
	{
		lTemp.pStart.x=rect.left+(rect.right-rect.left)*rand()*1.0/RAND_MAX;
		lTemp.pStart.y=rect.top+(rect.bottom-rect.top)*rand()*1.0/RAND_MAX;
		lTemp.pEnd.x=rect.left+(rect.right-rect.left)*rand()*1.0/RAND_MAX;
		lTemp.pEnd.y=rect.top+(rect.bottom-rect.top)*rand()*1.0/RAND_MAX;

		m_listAllLine.push_back(lTemp);
	}

	InvalidateRect(rect,1);
	ReleaseDC(pDC);
}

void CDrawSysView::Draw3DText(CString str,CRect rectText,int nHeight,int nWidth,int nWeight,BYTE bItalic,LPCTSTR lpszFacename,CDC *pDC)
{
	CFont fontLogo,*oldFont;
	COLORREF oldColor;

	fontLogo.CreateFont(nHeight,nWidth,0,0,nWeight,bItalic,FALSE,FALSE,
			DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
			FIXED_PITCH | FF_ROMAN,lpszFacename);
	pDC->SetBkMode(TRANSPARENT);
	
	oldFont=pDC->SelectObject(&fontLogo);

	oldColor=pDC->SetTextColor(RGB(0,0,0));
	pDC->DrawText(str,rectText+CPoint(1,1),DT_SINGLELINE | DT_LEFT | DT_VCENTER|DT_CENTER);
	pDC->SetTextColor(::GetSysColor(COLOR_BTNFACE));
	pDC->DrawText(str,rectText,DT_SINGLELINE | DT_LEFT | DT_VCENTER|DT_CENTER);

	pDC->SetTextColor(oldColor);
	pDC->SelectObject(oldFont);
}

void CDrawSysView::OnRefresh() 
{
	// TODO: Add your command handler code here
	CRect rect;

	GetClientRect(&rect);
	InvalidateRect(&rect,1);
}

void CDrawSysView::Circle(CIRCLE c, CDC *pDC)
{
	POINT pc=c.pMid;
	int r=c.r;

	Circle(pc,r,pDC);
}

void CDrawSysView::Line(LINE l,CDC *pDC)
{
	POINT p1=l.pStart;
	POINT p2=l.pEnd;

	Line(p1,p2,pDC);
}

⌨️ 快捷键说明

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