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

📄 drawsysview.cpp

📁 一个用C++写的简易绘图工具
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// DrawSysView.cpp : implementation of the CDrawSysView class
//

#include "stdafx.h"
#include "DrawSys.h"
#include "math.h"
#include "MainFrm.h"

#include "DrawSysDoc.h"
#include "DrawSysView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CDrawSysView

IMPLEMENT_DYNCREATE(CDrawSysView, CView)

BEGIN_MESSAGE_MAP(CDrawSysView, CView)
	//{{AFX_MSG_MAP(CDrawSysView)
	ON_COMMAND(IDM_LINE, OnLine)
	ON_COMMAND(IDM_CIRCLE, OnCircle)
	ON_UPDATE_COMMAND_UI(IDM_LINE, OnUpdateLine)
	ON_UPDATE_COMMAND_UI(IDM_CIRCLE, OnUpdateCircle)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(IDM_DDA, OnDda)
	ON_COMMAND(IDM_BRESENHAM, OnBresenham)
	ON_COMMAND(IDM_SET, OnSet)
	ON_COMMAND(IDM_MANYBD, OnManybd)
	ON_UPDATE_COMMAND_UI(IDM_MANYBD, OnUpdateManybd)
	ON_WM_LBUTTONDBLCLK()
	ON_COMMAND(IDM_CUT, OnCut)
	ON_UPDATE_COMMAND_UI(IDM_CUT, OnUpdateCut)
	ON_WM_RBUTTONDOWN()
	ON_WM_RBUTTONUP()
	ON_WM_RBUTTONDBLCLK()
	ON_COMMAND(IDM_BEZIER, OnBezier)
	ON_UPDATE_COMMAND_UI(IDM_BEZIER, OnUpdateBezier)
	ON_COMMAND(IDM_TEXT, OnText)
	ON_COMMAND(IDM_CLEAR, OnClear)
	ON_COMMAND(IDM_STROKE, OnStroke)
	ON_UPDATE_COMMAND_UI(IDM_STROKE, OnUpdateStroke)
	ON_UPDATE_COMMAND_UI(IDM_TEXT, OnUpdateText)
	ON_COMMAND(IDM_TEST, OnTest)
	ON_COMMAND(IDM_RANDLINE, OnRandline)
	ON_COMMAND(IDM_REFRESH, OnRefresh)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDrawSysView construction/destruction

CDrawSysView::CDrawSysView()
{
	// TODO: add construction code here
	m_dsDrawSort=DsNull;
	m_dlsDrawLSort=DlsBresenham;
	m_startPoint.x=0;
	m_startPoint.y=0;
	m_endPoint.x=0;
	m_endPoint.y=0;
	m_bIsMouseDown=0;
	m_bIsFirstDone=0;
	m_bIsDel=0;
	m_lPenColor=RGB(0,0,255);
	m_lBkColor=RGB(255,255,255);
	m_lFillColor=RGB(255,0,0);

	m_iPenWidth=1;
	m_lPenColor=RGB(0,0,255);
	m_dlsDrawLSort=DlsBresenham;

	m_hDLCursor=AfxGetApp()->LoadCursor(IDC_DRAWLINE);
	m_hDCCursor=AfxGetApp()->LoadCursor(IDC_DRAWCIRCLE);
	m_hCLCursor=AfxGetApp()->LoadCursor(IDC_CUTLINE);
	m_hDBCursor=AfxGetApp()->LoadCursor(IDC_DRAWBEZIER);
	m_hDTCursor=AfxGetApp()->LoadCursor(IDC_DRAWTEXT);
	m_hDSCursor=AfxGetApp()->LoadCursor(IDC_DRAWSTROKE);

	m_pwndStatusBar=0;
}

CDrawSysView::~CDrawSysView()
{
}

BOOL CDrawSysView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CDrawSysView drawing

void CDrawSysView::OnDraw(CDC* pDC)
{
	CDrawSysDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	list<LINE>::iterator pLine;
	list<CIRCLE>::iterator pCircle;
	list<BEZIER>::iterator pBezier;
	vector<TEXT>::iterator pText;

	//画直线
	for(pLine=m_listAllLine.begin();pLine!=m_listAllLine.end();pLine++)
		Line(*pLine,pDC);

	//画圆
	for(pCircle=m_listAllCircle.begin();pCircle!=m_listAllCircle.end();pCircle++)
			Circle(*pCircle,pDC);

	//画Bezier曲线
	for(pBezier=m_listBezier.begin();pBezier!=m_listBezier.end();pBezier++)
		Bezier(*pBezier,pDC);
	
	//画文本
	for(pText=m_vectorText.begin();pText!=m_vectorText.end();pText++)
		pDC->TextOut((*pText).p.x,(*pText).p.y,(*pText).str);

	CRect rectText;

	GetClientRect(&rectText);
	Draw3DText("欢迎使用陶氏作图系统",rectText,44,0,FW_BOLD,0,"楷体_GB2312",pDC);

	rectText.left=rectText.right-290;
	rectText.top=rectText.bottom-50;

	Draw3DText("http://AIfan.54sc.com",rectText,30,0,FW_THIN,1,"Arial",pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CDrawSysView printing

BOOL CDrawSysView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CDrawSysView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CDrawSysView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CDrawSysView diagnostics

#ifdef _DEBUG
void CDrawSysView::AssertValid() const
{
	CView::AssertValid();
}

void CDrawSysView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CDrawSysDoc* CDrawSysView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDrawSysDoc)));
	return (CDrawSysDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDrawSysView message handlers

void CDrawSysView::OnLine()
{
	// TODO: Add your command handler code here
	if(m_dsDrawSort!=DsLine)
	{
		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=DsLine;
	}
	else
		m_dsDrawSort=DsNull;		

	m_bIsFirstDone=0;
	m_bIsMouseDown=0;
}

void CDrawSysView::OnCircle()
{
	// TODO: Add your command handler code here
	if(m_dsDrawSort!=DsCircle)
	{
		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=DsCircle;
	}
	else
		m_dsDrawSort=DsNull;

	m_bIsFirstDone=0;
	m_bIsMouseDown=0;
}

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

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

void CDrawSysView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_bIsMouseDown=1;

	if(m_dsDrawSort==DsNull)
		return;
	
	CDC *pDC=GetDC();
	LINE lTemp;
	CRect rect;
	TEXT tTemp;
	int nSize;
	DWORD dwStyle=WS_CHILD | ES_WANTRETURN | WS_TABSTOP;;

	pDC->SetROP2(R2_NOTXORPEN);
	switch(m_dsDrawSort)
	{
	case DsBezier:
		Bezier(m_vectorCurBezier,pDC);
		m_vectorCurBezier.push_back(point);
		Bezier(m_vectorCurBezier,pDC);
		break;

	case DsText:
		if(!m_edtTextIn)
		{
			if (!m_edtTextIn.CreateEx(WS_EX_CLIENTEDGE,_T("Edit"),NULL, 
				dwStyle,CRect(0,0,0,0), this,IDC_EDIT_TEXTIN))
			{
				TRACE(_T("Failed to create Edit TextIn.\n"));
				OnClose();
			}

			CFont *font = CFont::FromHandle((HFONT)::GetStockObject(DEFAULT_GUI_FONT));
			m_edtTextIn.SetFont(font);
		}
		rect.left=point.x;
		rect.bottom=point.y+10;
		rect.right=rect.left+90;
		rect.top=rect.bottom-20;
		m_edtTextIn.MoveWindow(&rect,1);
		m_edtTextIn.UpdateWindow();
		m_edtTextIn.ShowWindow(1);

		m_edtTextIn.GetWindowText(tTemp.str);
		if(tTemp.str!="")
		{
			m_startPoint.y-=7;
			tTemp.p=m_startPoint;
			m_vectorText.push_back(tTemp);
		}
		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;
	}

	if(m_dsDrawSort==DsManyBd && m_bIsFirstDone)
	{
		Line(m_startPoint,point,pDC);

		lTemp.pStart=m_startPoint;
		lTemp.pEnd=point;
		m_listAllLine.push_back(lTemp);
	}

	if(m_dsDrawSort!=DsManyBd || !m_bIsFirstDone)
	{
		m_endPoint.x=m_startPoint.x=point.x;
		m_endPoint.y=m_startPoint.y=point.y;
	}

	m_endPoint.x=point.x;
	m_endPoint.y=point.y;

	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::OnLButtonDown(nFlags, point);
}

void CDrawSysView::Line_DDA(POINT p1, POINT p2,CDC *pDC)
{
	int i;

	if(p1.x==p2.x)
	{
		//为竖线
		if(p1.y<=p2.y)
		{
			for(i=p1.y;i<=p2.y;i++)
				pDC->SetPixel(p1.x,i,m_lPenColor);
		}
		else
		{
			for(i=p2.y;i<=p1.y;i++)
				pDC->SetPixel(p1.x,i,m_lPenColor);
		}

		return;
	}

	//为横线
	if(p1.y==p2.y)
	{
		if(p1.x<=p2.x)
		{
			for(i=p1.x;i<=p2.x;i++)
				pDC->SetPixel(i,p1.y,m_lPenColor);
		}
		else
		{
			for(i=p2.x;i<=p1.x;i++)
				pDC->SetPixel(i,p1.y,m_lPenColor);
		}

		return;
	}

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

	if(abs(m)<=1)
	{
		if(p1.x<p2.x)
		{
			fTemp=p1.y-m;
			for(i=p1.x;i<=p2.x;i++)
				pDC->SetPixel(i,fTemp+=m,m_lPenColor);
		}
		else
		{
			fTemp=p2.y-m;
			for(i=p2.x;i<=p1.x;i++)
				pDC->SetPixel(i,fTemp+=m,m_lPenColor);
		}
		return;
	}

	if(p1.y<p2.y)
	{
		fTemp=p1.x-1/m;
		for(i=p1.y;i<=p2.y;i++)
			pDC->SetPixel(fTemp+=1/m,i,m_lPenColor);
	}
	else
	{
		fTemp=p2.x-1/m;
		for(i=p2.y;i<=p1.y;i++)
			pDC->SetPixel(fTemp+=1/m,i,m_lPenColor);
	}
}

void CDrawSysView::Line_Bresenham(POINT p1, POINT p2,CDC *pDC)
{
	int i;

	if(p1.x==p2.x)
	{
		//为竖线
		if(p1.y<=p2.y)
		{
			for(i=p1.y;i<=p2.y;i++)
				pDC->SetPixel(p1.x,i,m_lPenColor);
		}
		else
		{
			for(i=p2.y;i<=p1.y;i++)
				pDC->SetPixel(p1.x,i,m_lPenColor);
		}

		return;
	}

	//为横线
	if(p1.y==p2.y)
	{
		if(p1.x<=p2.x)
		{
			for(i=p1.x;i<=p2.x;i++)
				pDC->SetPixel(i,p1.y,m_lPenColor);
		}
		else
		{
			for(i=p2.x;i<=p1.x;i++)
				pDC->SetPixel(i,p1.y,m_lPenColor);
		}

		return;
	}

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

	p=2*m-1;
	if(m>0 && m<=1)
	{
		if(p1.x<p2.x)
		{
			while(p1.x<=p2.x)
			{
				pDC->SetPixel(p1.x++,p1.y,m_lPenColor);
				if(p>=0)
				{
					p+=2*m-2;
					p1.y++;
				}
				else
					p+=2*m;
			}
		}
		else
		{
			while(p2.x<=p1.x)
			{
				pDC->SetPixel(p2.x++,p2.y,m_lPenColor);
				if(p>=0)
				{
					p+=2*m-2;
					p2.y++;
				}
				else
					p+=2*m;
			}
		}

		return;
	}

	p=-2*m-1;
	if(m<0 && m>=-1)
	{
		if(p1.x<p2.x)
		{
			while(p1.x<=p2.x)
			{
				pDC->SetPixel(p1.x++,p1.y,m_lPenColor);
				if(p>=0)
				{
					p+=-2*m-2;
					p1.y--;
				}
				else
					p+=-2*m;
			}
		}
		else
		{
			while(p2.x<=p1.x)
			{
				pDC->SetPixel(p2.x++,p2.y,m_lPenColor);
				if(p>=0)
				{
					p+=-2*m-2;
					p2.y--;
				}
				else
					p+=-2*m;
			}
		}

		return;
	}

	p=2/m-1;
	if(m>1)
	{
		if(p1.y<p2.y)
		{
			while(p1.y<=p2.y)
			{
				pDC->SetPixel(p1.x,p1.y++,m_lPenColor);
				if(p>=0)
				{
					p+=2/m-2;
					p1.x++;
				}
				else
					p+=2/m;
			}
		}
		else
		{
			while(p2.y<=p1.y)
			{
				pDC->SetPixel(p2.x,p2.y++,m_lPenColor);
				if(p>=0)
				{
					p+=2/m-2;
					p2.x++;
				}
				else
					p+=2/m;
			}
		}

		return;
	}

	p=-2/m-1;
	if(p1.y<p2.y)
	{
		while(p1.y<=p2.y)
		{
			pDC->SetPixel(p1.x,p1.y++,m_lPenColor);
			if(p>=0)
			{
				p+=-2/m-2;
				p1.x--;
			}
			else
				p+=-2/m;
		}
	}
	else
	{
		while(p2.y<=p1.y)
		{
			pDC->SetPixel(p2.x,p2.y++,m_lPenColor);
			if(p>=0)
			{
				p+=-2/m-2;
				p2.x--;
			}
			else
				p+=-2/m;
		}
	}
}

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

	CDC *pDC=GetDC();
	CPen Pen;
	LINE lTemp;
	CIRCLE cTemp;
	int r;
	RECT rect;
	list<LINE>::iterator pLine=m_listAllLine.begin();
	list<LINE>::iterator pTemp;

	switch(m_dsDrawSort)
	{
	case DsManyBd:
	case DsLine:
		Line(m_startPoint,point,GetDC());

⌨️ 快捷键说明

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