📄 draw.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 + -