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

📄 drawdoc.cpp

📁 Visual C++_ 600 编程学习捷径
💻 CPP
字号:
// drawDoc.cpp : implementation of the CDrawDoc class
//

#include "stdafx.h"
#include "draw.h"

#include "drawDoc.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDrawDoc

IMPLEMENT_DYNCREATE(CDrawDoc, CDocument)

BEGIN_MESSAGE_MAP(CDrawDoc, CDocument)
	//{{AFX_MSG_MAP(CDrawDoc)
	ON_COMMAND(ID_EDIT_CLEARALL, OnEditClearAll)
	ON_UPDATE_COMMAND_UI(ID_EDIT_CLEARALL, OnUpdateEditClearAll)
	ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
	ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
	//}}AFX_MSG_MAP
	ON_COMMAND(ID_FILE_SEND_MAIL, OnFileSendMail)
	ON_UPDATE_COMMAND_UI(ID_FILE_SEND_MAIL, OnUpdateFileSendMail)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDrawDoc construction/destruction

CDrawDoc::CDrawDoc()
{
	// TODO: add one-time construction code here

}

CDrawDoc::~CDrawDoc()
{
}

BOOL CDrawDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CDrawDoc serialization

void CDrawDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		m_DrawArray.Serialize(ar);
	}
	else
	{
		m_DrawArray.Serialize(ar);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CDrawDoc diagnostics

#ifdef _DEBUG
void CDrawDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CDrawDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CDrawDoc commands
void CDrawDoc::AddDraw(CDrawBase *pDraw)
{
	m_DrawArray.Add(pDraw);
	SetModifiedFlag();
}

CDrawBase *CDrawDoc::GetDraw(int Index)
{
	if(Index<0||Index>m_DrawArray.GetUpperBound())
		return 0;
	return (CDrawBase *)m_DrawArray.GetAt(Index);
}

int CDrawDoc::GetNumDraws()
{
	return m_DrawArray.GetSize();
}


//CDrawBase类的实现
IMPLEMENT_SERIAL(CDrawBase, CObject, 1)

CRect CDrawBase::GetDimRect()
{
	return CRect(min(m_X1, m_X2),
			  min(m_Y1, m_Y2),
			  max(m_X1, m_X2) + 1,
			  max(m_Y1, m_Y2) + 1);
}

void CDrawBase::Serialize(CArchive& ar)
{
	if(ar.IsStoring())
		ar << m_X1 << m_Y1 << m_X2 << m_Y2 << m_Color;

	else 
		ar >> m_X1 >> m_Y1 >> m_X2 >> m_Y2 >> m_Color;
}

//CLine类的实现代码
IMPLEMENT_SERIAL(CLine, CDrawBase, 1)

CLine::CLine(int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness)
{
	m_X1 = X1;
	m_Y1 = Y1;
	m_X2 = X2;
	m_Y2 = Y2;
	m_Color = Color;
	m_Thickness = Thickness;
}

void CLine::Serialize(CArchive& ar)
{
	CDrawBase::Serialize(ar);
	if(ar.IsStoring())
		ar << m_Thickness;
	else
		ar >> m_Thickness;
}

void CLine::Draw(CDC *pDC)
{
	CPen Pen, *pOldPen;
	Pen.CreatePen(PS_SOLID, m_Thickness, m_Color);
	pOldPen = pDC->SelectObject(&Pen);

	pDC->MoveTo(m_X1, m_Y1);
	pDC->LineTo(m_X2, m_Y2);

	pDC->SelectObject(pOldPen);
}

//CRectangle类的实现代码
IMPLEMENT_SERIAL(CRectangle, CDrawBase, 1)
//数据成员初始化
CRectangle::CRectangle(int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness)
{
	m_X1 = X1;
	m_Y1 = Y1;
	m_X2 = X2;
	m_Y2 = Y2;
	m_Color = Color;
	m_Thickness = Thickness;
}

void CRectangle::Serialize(CArchive& ar)
{
	CDrawBase::Serialize(ar); //基类数据成员序列化
	if(ar.IsStoring())        //m_Thickness序列化
		ar << m_Thickness;
	else
		ar >> m_Thickness;
}

void CRectangle::Draw(CDC *pDC)
{
	CPen Pen, *pOldPen;
	Pen.CreatePen(PS_INSIDEFRAME, m_Thickness, m_Color);//创建画笔
	pOldPen = pDC->SelectObject(&Pen); //选入画笔,并保存原来的画笔
	//选入库存画刷,并保存原来的画刷
	CBrush *pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);

	//绘制矩形
	pDC->Rectangle(m_X1,m_Y1,m_X2,m_Y2);

	//恢复原来的画笔和画刷
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}

//CRectFill类的实现代码
IMPLEMENT_SERIAL(CRectFill, CDrawBase, 1)

CRectFill::CRectFill(int X1, int Y1, int X2, int Y2, COLORREF Color)
{
	m_X1 = X1;
	m_Y1 = Y1;
	m_X2 = X2;
	m_Y2 = Y2;
	m_Color = Color;
}

void CRectFill::Draw(CDC *pDC)
{
	CBrush Brush, *pOldBrush;
	CPen Pen, *pOldPen;
	
	//创建并选入画笔
	Pen.CreatePen(PS_INSIDEFRAME, 1, m_Color);
	pOldPen = pDC->SelectObject(&Pen);

	//创建并选入画刷
	Brush.CreateSolidBrush(m_Color);
	pOldBrush = pDC->SelectObject(&Brush);

	//绘制填充矩形
	pDC->Rectangle(m_X1, m_Y1, m_X2, m_Y2);

	//恢复原来的画笔和画刷
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}

//CRectRound类的实现代码
IMPLEMENT_SERIAL(CRectRound,CDrawBase,1)

CRectRound::CRectRound(int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness)
{
	m_X1 = min(X1, X2);
	m_Y1 = min(Y1, Y2);
	m_X2 = max(X1, X2);
	m_Y2 = max(Y1, Y2);
	m_Color = Color;
	m_Thickness = Thickness;
}
void CRectRound::Serialize(CArchive& ar)
{
	CDrawBase::Serialize(ar);//基类数据成员序列化
	if(ar.IsStoring())       //m_Thickness序列化
		ar << m_Thickness;
	else
		ar >> m_Thickness;
}
void CRectRound::Draw(CDC *pDC)
{
	CPen Pen, *pOldPen;
	//创建并选入画笔
	Pen.CreatePen(PS_INSIDEFRAME,m_Thickness,m_Color);
	pOldPen = pDC->SelectObject(&Pen);
	//选入库存画刷,并保存原来的画刷
	CBrush *pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);

	int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1)/6;//计算圆角尺寸
	//绘制圆角矩形
	pDC->RoundRect(m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound);

	//恢复原来的画笔和画刷
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}

//CRectRoundFill类的实现代码
IMPLEMENT_SERIAL(CRectRoundFill, CDrawBase, 1)

CRectRoundFill::CRectRoundFill(int X1, int Y1, int X2, int Y2, COLORREF Color)
{
	m_X1 = min(X1, X2);
	m_Y1 = min(Y1, Y2);
	m_X2 = max(X1, X2);
	m_Y2 = max(Y1, Y2);
	m_Color = Color;
}

void CRectRoundFill::Draw(CDC *pDC)
{
	CBrush Brush, *pOldBrush;
	CPen Pen, *pOldPen;

	//创建并选入画笔和画刷
	Pen.CreatePen(PS_INSIDEFRAME, 1, m_Color);
	pOldPen = pDC->SelectObject(&Pen);
	Brush.CreateSolidBrush(m_Color);
	pOldBrush = pDC->SelectObject(&Brush);

	int SizeRound = (m_X2 - m_X1 + m_Y2 - m_Y1)/6;//计算圆角尺寸
	//绘制填充圆角矩形
	pDC->RoundRect(m_X1, m_Y1, m_X2, m_Y2, SizeRound, SizeRound);

	//恢复原来的画笔和画刷
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}

//CCircle类的实现代码
IMPLEMENT_SERIAL(CCircle, CDrawBase, 1)

CCircle::CCircle(int X1, int Y1, int X2, int Y2, COLORREF Color, int Thickness)
{
	m_X1 = min(X1, X2);
	m_Y1 = min(Y1, Y2);
	m_X2 = max(X1, X2);
	m_Y2 = max(Y1, Y2);
	m_Color = Color;
	m_Thickness = Thickness;
}
void CCircle::Serialize(CArchive& ar)
{
	CDrawBase::Serialize(ar);//基类数据成员序列化
	if(ar.IsStoring())       //m_Thickness序列化
		ar << m_Thickness;
	else 
		ar >> m_Thickness;
}
void CCircle::Draw(CDC *pDC)
{
	CPen Pen, *pOldPen;

	Pen.CreatePen(PS_INSIDEFRAME, m_Thickness, m_Color);//创建画笔
	pOldPen = pDC->SelectObject(&Pen); //选入画笔,并保存原来的画笔
	//选入库存画刷,并保存原来的画刷
	CBrush *pOldBrush = (CBrush *)pDC->SelectStockObject(NULL_BRUSH);

	//绘制圆或椭圆
	pDC->Ellipse(m_X1, m_Y1, m_X2, m_Y2);

	//恢复原来的画笔和画刷
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}

//CCircleFill类的实现代码
IMPLEMENT_SERIAL(CCircleFill, CDrawBase, 1)

CCircleFill::CCircleFill(int X1, int Y1, int X2, int Y2, COLORREF Color)
{
	m_X1 = min(X1, X2);
	m_Y1 = min(Y1, Y2);
	m_X2 = max(X1, X2);
	m_Y2 = max(Y1, Y2);
	m_Color = Color;
}

void CCircleFill::Draw(CDC *pDC)
{
	CPen Pen, *pOldPen;
	CBrush Brush, *pOldBrush;

	//创建并选入画笔和画刷
	Pen.CreatePen(PS_INSIDEFRAME, 1, m_Color);
	pOldPen = pDC->SelectObject(&Pen);
	Brush.CreateSolidBrush(m_Color);
	pOldBrush = pDC->SelectObject(&Brush);

	//绘制填充圆或椭圆
	pDC->Ellipse(m_X1, m_Y1, m_X2, m_Y2);

	//恢复原来的画笔和画刷
	pDC->SelectObject(pOldPen);
	pDC->SelectObject(pOldBrush);
}

//CText类的实现代码
IMPLEMENT_SERIAL(CText, CDrawBase, 1)

CText::CText(int X1, int Y1, int X2, int Y2, COLORREF Color, LOGFONT lf, CString str)
{
	m_X1 = min(X1, X2);
	m_Y1 = min(Y1, Y2);
	m_X2 = max(X1, X2);
	m_Y2 = max(Y1, Y2);
	m_Color = Color;
	m_lf = lf;
	m_String = str;
}

void CText::Serialize(CArchive &ar)
{
	CDrawBase::Serialize(ar);//基类数据成员序列化
	if(ar.IsStoring())       //m_lf和m_String的序列化
	{
		ar.Write(&m_lf, sizeof(m_lf));
		ar << m_String;
	}
	else 
	{	ar.Read(&m_lf, sizeof(m_lf));
		ar >> m_String;
	}
}

void CText::Draw(CDC *pDC)
{
	CFont Font, *pOldFont;
	//创建并选入字体
	Font.CreateFontIndirect(&m_lf);
	pOldFont = pDC->SelectObject(&Font);
	//设置字体颜色
	pDC->SetTextColor(m_Color);
	//设置字体背景透明
	pDC->SetBkMode(TRANSPARENT);

	//输出字体
	pDC->TextOut(m_X1, m_Y1, m_String);

	//恢复原来的字体
	pDC->SelectObject(pOldFont);
}


void CDrawDoc::DeleteContents() 
{
	// TODO: Add your specialized code here and/or call the base class
	int Index = m_DrawArray.GetSize();
	while(Index--)
		delete m_DrawArray.GetAt(Index);
	m_DrawArray.RemoveAll();

	CDocument::DeleteContents();
}

void CDrawDoc::OnEditClearAll() 
{
	// TODO: Add your command handler code here
	DeleteContents();
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

void CDrawDoc::OnUpdateEditClearAll(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_DrawArray.GetSize());
}

void CDrawDoc::OnEditUndo() 
{
	// TODO: Add your command handler code here
	int Index = m_DrawArray.GetUpperBound();
	if(Index > -1)
	{
		delete m_DrawArray.GetAt(Index);
		m_DrawArray.RemoveAt(Index);
	}
	UpdateAllViews(NULL);
	SetModifiedFlag();
}

void CDrawDoc::OnUpdateEditUndo(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_DrawArray.GetSize());
}

⌨️ 快捷键说明

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