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

📄 draw.cpp

📁 简单画图
💻 CPP
字号:
#include "stdafx.h"
#include "resource.h"       // main symbols

#include "Draw.h"
#include "math.h"

#define MAXOFFSET 2 // 定义输入点与真实点最大误差值
					// 在AtPoint和AtLine函数中使用

//-----------------------------
// 以下为CDrawObject类方法实现
//-----------------------------

COLORREF CDrawObject::GetPenColor()
{
	if(this)
	{//当前类为有效类指针
		return m_PenColor;
	}
	else
	{
		return 0;
	}
}

void CDrawObject::SetPenColor(COLORREF color)
{
	if(this)
	{//当前类为有效类指针
		m_PenColor = color;
	}
}

//--------------------------------
//以下为CDrawLine(绘线)类方法实现
//--------------------------------

CDrawLine::CDrawLine(COLORREF color, int width)
{
	m_x1=m_y1=m_x2=m_y2=0;
	SetPenColor(color);
	SetPenWidth(width);
	m_nStyle = IDT_LINE;
}

void CDrawLine::NewPoint(long x, long y)
{
	m_x1 = m_x2 = x;
	m_y1 = m_y2 = y;
}

void CDrawLine::MoveAt(CDC *pDC, long x, long y)
{
	//以下设置DC
	COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
	CPen pen(PS_SOLID, GetPenWidth(), XorColor), *oldpen;
	int oldmode = pDC->GetROP2();
	oldpen = pDC->SelectObject(&pen);
	pDC->SetROP2(R2_XORPEN);
	//以下移动直线
	pDC->MoveTo(m_x1, m_y1);
	pDC->LineTo(m_x2, m_y2);//删除原图形

	m_x2 = x;
	m_y2 = y;

	pDC->MoveTo(m_x1, m_y1);
	pDC->LineTo(m_x2, m_y2);//绘新图形

	//以下恢复DC
	pDC->SelectObject(oldpen);
	pen.DeleteObject();//释放笔资源
}

void CDrawLine::Draw(CDC* pDC)
{
	//以下设置DC
	CPen pen(PS_SOLID, GetPenWidth(), GetPenColor()), *oldpen;
	oldpen = pDC->SelectObject(&pen);
	//以下移动直线
	pDC->MoveTo(m_x1, m_y1);
	pDC->LineTo(m_x2, m_y2);

	//以下恢复DC
	pDC->SelectObject(oldpen);
	pen.DeleteObject();//释放笔资源
}

//--------------------------------
//以下为CDrawCurve(曲线)类方法实现
//--------------------------------

CDrawCurve::CDrawCurve(COLORREF color, int width)
{
	m_x = m_y = 0;
	SetPenColor(color);
	SetPenWidth(width);
	m_nStyle = IDT_LINE;
}

void CDrawCurve::NewPoint(long x, long y)
{
	m_x = x;
	m_y = y;
}

void CDrawCurve::MoveAt(CDC *pDC, long x, long y)
{
	//以下设置DC
	CPen pen(PS_DOT, GetPenWidth(), GetPenColor()), *oldpen;
	oldpen = pDC->SelectObject(&pen);

	pDC->MoveTo(m_x, m_y);
	m_x = x;
	m_y = y;
	pDC->LineTo(x, y);

	//以下恢复DC
	pDC->SelectObject(oldpen);
	pen.DeleteObject();//释放笔资源
}

//--------------------------------
//以下为CDrawSelect(选择)类方法实现
//--------------------------------

CDrawSelect::CDrawSelect(COLORREF color)
{
	m_x1=m_y1=m_x2=m_y2=0;
	SetPenColor(RGB(0,0,0));
	m_nStyle = IDT_RECTANGLE;
	maponmouse=false;
	copied=false;
	//AfxMessageBox("fdsa");
	
}
bool CDrawSelect::isin(CPoint p)
{
	if ((p.x>m_x1)&&(p.y>m_y1)&&(p.x<m_x2)&&(p.y<m_y2))
	{	
		
		return true;
	}
	else
	{
		
		return false;
	}
}

void CDrawSelect::NewPoint(long x, long y)
{
	m_x1 = m_x2 = x;
	m_y1 = m_y2 = y;
}

void CDrawSelect::MoveAt(CDC *pDC, long x, long y)
{
	//以下设置DC
	COLORREF CopyColor = GetPenColor();
	COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
	CPen pen(PS_DOT, 1, XorColor), *oldpen;
	int oldmode = pDC->GetROP2();
	oldpen = pDC->SelectObject(&pen);
	pDC->SetROP2(R2_XORPEN);
	//首先删除原矩形
	pDC->MoveTo(m_x1, m_y1);
	pDC->LineTo(m_x1, m_y2);
	pDC->LineTo(m_x2, m_y2);
	pDC->LineTo(m_x2, m_y1);
	pDC->LineTo(m_x1, m_y1);

	m_x2 = x;
	m_y2 = y;

	//绘新图形
	pDC->MoveTo(m_x1, m_y1);
	pDC->LineTo(m_x1, m_y2);
	pDC->LineTo(m_x2, m_y2);
	pDC->LineTo(m_x2, m_y1);
	pDC->LineTo(m_x1, m_y1);

	//以下恢复DC
	pDC->SetROP2(oldmode);
	pDC->SelectObject(oldpen);
	pen.DeleteObject();//释放笔资源
}

void CDrawSelect::Clear(CDC * pDC)
{
	//以下设置DC
	COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
	CPen pen(PS_SOLID, 1, XorColor), *oldpen;
	int oldmode = pDC->GetROP2();
	oldpen = pDC->SelectObject(&pen);
	pDC->SetROP2(R2_XORPEN);
	//首先删除原矩形
	pDC->MoveTo(m_x1, m_y1);
	pDC->LineTo(m_x1, m_y2);
	pDC->LineTo(m_x2, m_y2);
	pDC->LineTo(m_x2, m_y1);
	pDC->LineTo(m_x1, m_y1);

	//以下恢复DC
	pDC->SetROP2(oldmode);
	pDC->SelectObject(oldpen);
	pen.DeleteObject();//释放笔资源
}

//-----------------------------------
// 以下为CDrawRect(绘矩形)类方法实现
//-----------------------------------

CDrawRect::CDrawRect(COLORREF color, int width, bool fill)
{
	m_x1=m_y1=m_x2=m_y2=0;
	SetPenColor(color);
	SetPenWidth(width);
	SetFill(fill);
	m_nStyle = IDT_RECTANGLE;
}
void CDrawRect::Draw(CDC* pDC)
{

	{
		
		CPen pen(PS_SOLID, GetPenWidth(), GetPenColor());
		int oldmode = pDC->GetROP2();

		CPen* oldpen = pDC->SelectObject(&pen);
		CBrush* oldbrush;
		CBrush  brush(GetPenColor());

		if( GetFill() )	
			oldbrush = (CBrush*)pDC->SelectObject(&brush);
		else
			oldbrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);

		pDC->Rectangle(m_x1, m_y1, m_x2, m_y2);


		//以下恢复DC
		pDC->SetROP2(oldmode);
		pDC->SelectObject(oldpen);
		pDC->SelectObject(&oldbrush);
		pen.DeleteObject();
	}
}


void CDrawRect::NewPoint(long x, long y)
{
	m_x1 = m_x2 = x;
	m_y1 = m_y2 = y;
}

void CDrawRect::MoveAt(CDC *pDC, long x, long y)
{
	if( !GetFill() )
	{
		COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
		CPen pen(PS_SOLID, GetPenWidth(), XorColor);
		int oldmode = pDC->GetROP2();

		CPen* oldpen = pDC->SelectObject(&pen);
		//设置为“空”刷,既不填充。
		CBrush* oldbrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
	
		pDC->SetROP2(R2_XORPEN);

		//删除原图形
		pDC->Rectangle(m_x1, m_y1, m_x2, m_y2);

		//修改新图形坐标
		
	m_x2 = x;
	m_y2 = y;

		//绘新图形
		pDC->Rectangle(m_x1, m_y1, m_x2, m_y2);

		//以下恢复DC
		pDC->SetROP2(oldmode);
		pDC->SelectObject(oldpen);
		pen.DeleteObject();
	}
	else
	{
		COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
		CPen pen(PS_SOLID, GetPenWidth(), XorColor);
		int oldmode = pDC->GetROP2();

		CPen* oldpen = pDC->SelectObject(&pen);
		//设置刷填充。
		CBrush  brush(XorColor);
		CBrush* oldbrush = (CBrush*)pDC->SelectObject(brush);


		pDC->SetROP2(R2_XORPEN);

		//删除原图形
		pDC->Rectangle(m_x1, m_y1, m_x2, m_y2);

		//修改新图形坐标

		m_x2 = x;
		m_y2 = y;

		//绘新图形
		pDC->Rectangle(m_x1, m_y1, m_x2, m_y2);

		//以下恢复DC
		pDC->SetROP2(oldmode);
		pDC->SelectObject(oldpen);
		pDC->SelectObject(&oldbrush);
		pen.DeleteObject();
	}
}

//-------------------------------------
// 以下为CDrawEllipse(绘椭圆)类方法实现
//-------------------------------------

CDrawEllipse::CDrawEllipse(COLORREF color, int width, bool fill)
{
	m_x1=m_y1=m_x2=m_y2=0;
	SetPenColor(color);
	SetPenWidth(width);
	SetFill(fill);
	m_nStyle = IDT_ELLIPSE;
}

void CDrawEllipse::NewPoint(long x, long y)
{
	m_x1 = m_x2 = x;
	m_y1 = m_y2 = y;
}

void CDrawEllipse::MoveAt(CDC *pDC, long x, long y)
{
	//以下设置DC
		//以下设置DC
	if( !GetFill() )
	{
		COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
		CPen pen(PS_SOLID, GetPenWidth(), XorColor);
		int oldmode = pDC->GetROP2();

		CPen* oldpen = pDC->SelectObject(&pen);
		//设置为“空”刷,既不填充。
		CBrush* oldbrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
	
		pDC->SetROP2(R2_XORPEN);

		//删除原图形
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);

		//修改新图形坐标
		
	m_x2 = x;
	m_y2 = y;

		//绘新图形
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);

		//以下恢复DC
		pDC->SetROP2(oldmode);
		pDC->SelectObject(oldpen);
		pen.DeleteObject();
	}
	else
	{
		COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
		CPen pen(PS_SOLID, GetPenWidth(), XorColor);
		int oldmode = pDC->GetROP2();

		CPen* oldpen = pDC->SelectObject(&pen);
		//设置刷填充。
		CBrush  brush(XorColor);
		CBrush* oldbrush = (CBrush*)pDC->SelectObject(brush);


		pDC->SetROP2(R2_XORPEN);

		//删除原图形
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);

		//修改新图形坐标

		m_x2 = x;
		m_y2 = y;

		//绘新图形
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);

		//以下恢复DC
		pDC->SetROP2(oldmode);
		pDC->SelectObject(oldpen);
		pDC->SelectObject(&oldbrush);
		pen.DeleteObject();
	}

}

void CDrawEllipse::Draw(CDC* pDC)
{

	{
		
		CPen pen(PS_SOLID, GetPenWidth(), GetPenColor());
		int oldmode = pDC->GetROP2();

		CPen* oldpen = pDC->SelectObject(&pen);
		CBrush* oldbrush;
		CBrush  brush(GetPenColor());
		if( GetFill() )	
			oldbrush = (CBrush*)pDC->SelectObject(&brush);
		else
			oldbrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);
	
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);


		//以下恢复DC
		pDC->SetROP2(oldmode);
		pDC->SelectObject(oldpen);
		pDC->SelectObject(&oldbrush);
		pen.DeleteObject();
	}
}

//-----------------------------------
// 以下为CDrawCircle(绘圆)类方法实现
//-----------------------------------

CDrawCircle::CDrawCircle(COLORREF color, int width, bool fill)
{
	m_x1=m_y1=m_x2=m_y2=0;
	SetPenColor(color);
	SetPenWidth(width);
	SetFill(fill);
	m_nStyle = IDT_CIRCLE;
}

void CDrawCircle::NewPoint(long x, long y)
{
	m_x1 = m_x2 = x;
	m_y1 = m_y2 = y;
}

void CDrawCircle::MoveAt(CDC *pDC, long x, long y)
{
	//以下设置DC
	if( !GetFill() )
	{
		COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
		CPen pen(PS_SOLID, GetPenWidth(), XorColor);
		int oldmode = pDC->GetROP2();

		CPen* oldpen = pDC->SelectObject(&pen);
		//设置为“空”刷,既不填充。
		CBrush* oldbrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
	
		pDC->SetROP2(R2_XORPEN);

		//删除原图形
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);

		//修改新图形坐标
		long min = min(abs(x - m_x1), abs(y - m_y1));
		if( x < m_x1 )
			m_x2 = m_x1 - min;
		else
			m_x2 = m_x1 + min;
		if( y < m_y1 )
			m_y2 = m_y1 - min;
		else
			m_y2 = m_y1 + min;

		//绘新图形
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);

		//以下恢复DC
		pDC->SetROP2(oldmode);
		pDC->SelectObject(oldpen);
		pen.DeleteObject();
	}
	else
	{
		COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
		CPen pen(PS_SOLID, GetPenWidth(), XorColor);
		int oldmode = pDC->GetROP2();

		CPen* oldpen = pDC->SelectObject(&pen);
		//设置刷填充。
		CBrush  brush(XorColor);
		CBrush* oldbrush = (CBrush*)pDC->SelectObject(brush);


		pDC->SetROP2(R2_XORPEN);

		//删除原图形
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);

		//修改新图形坐标
		long min = min(abs(x - m_x1), abs(y - m_y1));
		if( x < m_x1 )
			m_x2 = m_x1 - min;
		else
			m_x2 = m_x1 + min;
		if( y < m_y1 )
			m_y2 = m_y1 - min;
		else
			m_y2 = m_y1 + min;

		//绘新图形
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);

		//以下恢复DC
		pDC->SetROP2(oldmode);
		pDC->SelectObject(oldpen);
		pDC->SelectObject(&oldbrush);
		pen.DeleteObject();
	}
	
}

void CDrawCircle::Draw(CDC* pDC)
{
	//if( GetFill() )
	{
		
		CPen pen(PS_SOLID, GetPenWidth(), GetPenColor());
		int oldmode = pDC->GetROP2();

		CPen* oldpen = pDC->SelectObject(&pen);
		CBrush* oldbrush;
		CBrush  brush(GetPenColor());
		if( GetFill() )	
			oldbrush = (CBrush*)pDC->SelectObject(&brush);
		else
			oldbrush=(CBrush*)pDC->SelectStockObject(NULL_BRUSH);

		if( GetFill() )
			oldbrush = (CBrush*)pDC->SelectObject(&brush);
		pDC->Ellipse(m_x1, m_y1, m_x2, m_y2);


		//以下恢复DC
		pDC->SetROP2(oldmode);
		pDC->SelectObject(oldpen);
		pDC->SelectObject(&oldbrush);
		pen.DeleteObject();
	}
}

//-----------------------------------
// 以下为CDrawPoly(多边形)类方法实现
//-----------------------------------

CDrawPoly::CDrawPoly(COLORREF color, int width)
{
	m_nNumber = 0;
	SetPenColor(color);
	SetPenWidth(width);
	m_nStyle = IDT_PLINE;
}

void CDrawPoly::NewPoint(long x, long y)
{
	m_nNumber = 1;
	m_aPoints[0].x = x;
	m_aPoints[0].y = y;
	m_oldx = x;
	m_oldy = y;
}

int CDrawPoly::AddPoint(long x, long y)
{
	if(m_nNumber < MAXPLINEPOINT)
	{
		m_aPoints[m_nNumber].x = x;
		m_aPoints[m_nNumber].y = y;
		m_oldx = x;
		m_oldy = y;
		m_nNumber++;
	}

	//判断是否可继续绘折线
	if(m_nNumber != MAXPLINEPOINT)
	{//可继续下一点
		return m_nNumber+1;
	}
	else
		return 0;
}

void CDrawPoly::MoveAt(CDC *pDC, long x, long y)
{
	//以下设置DC
	COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
	CPen pen(PS_SOLID, GetPenWidth(), XorColor);
	int oldmode = pDC->GetROP2();
	CPen* oldpen = pDC->SelectObject(&pen);
	//设置为“空”刷,既不填充。
	CBrush* oldbrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH);
	pDC->SetROP2(R2_XORPEN);

	//修改新图形坐标
	pDC->MoveTo(m_aPoints[m_nNumber-1].x, m_aPoints[m_nNumber-1].y);
	pDC->LineTo(m_oldx, m_oldy);
	m_oldx = x;
	m_oldy = y;
	pDC->MoveTo(m_aPoints[m_nNumber-1].x, m_aPoints[m_nNumber-1].y);
	pDC->LineTo(m_oldx, m_oldy);

	//以下恢复DC
	pDC->SetROP2(oldmode);
	pDC->SelectObject(oldpen);
	pDC->SelectObject(oldbrush);
	pen.DeleteObject();
}

void CDrawPoly::EndPoint(CDC* pDC)
{
	CPen pen(PS_SOLID, 1, GetPenColor());
	CPen* oldpen = pDC->SelectObject(&pen);
	pDC->MoveTo(m_aPoints[m_nNumber-1].x, m_aPoints[m_nNumber-1].y);
	pDC->LineTo(m_aPoints[0].x, m_aPoints[0].y);
	pDC->SelectObject(oldpen);
	pen.DeleteObject();
}

void CDrawSelect::Set(CDC *pDC,long x1, long y1,long width,long heighth)
{
	m_x1=x1;
	m_y1=y1;
	m_x2=x1+width;
	m_y2=y1+heighth;
		//以下设置DC
	COLORREF CopyColor = GetPenColor();
	COLORREF XorColor = pDC->GetBkColor() ^ GetPenColor();
	CPen pen(PS_DOT, 1, XorColor), *oldpen;
	int oldmode = pDC->GetROP2();
	oldpen = pDC->SelectObject(&pen);
	pDC->SetROP2(R2_XORPEN);

	pDC->MoveTo(m_x1, m_y1);
	pDC->LineTo(m_x1, m_y2);
	pDC->LineTo(m_x2, m_y2);
	pDC->LineTo(m_x2, m_y1);
	pDC->LineTo(m_x1, m_y1);
//AfxMessageBox("fds");
	//以下恢复DC
	pDC->SetROP2(oldmode);
	pDC->SelectObject(oldpen);
	pen.DeleteObject();//释放笔资源
}

⌨️ 快捷键说明

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