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

📄 easydrawview.cpp

📁 EasyDraw是一个简单的绘图软件
💻 CPP
字号:
// EasyDrawView.cpp : CEasyDrawView 类的实现
//

#include "stdafx.h"
#include "EasyDraw.h"

#include "EasyDrawDoc.h"
#include "EasyDrawView.h"

#include "MainFrm.h"
#include "DrawToolDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CEasyDrawView

IMPLEMENT_DYNCREATE(CEasyDrawView, CView)

BEGIN_MESSAGE_MAP(CEasyDrawView, CView)
	// 标准打印命令
	ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_TOOL_LINE, &CEasyDrawView::OnToolLine)
	ON_COMMAND(ID_TOOL_RECT, &CEasyDrawView::OnToolRect)
	ON_COMMAND(ID_TOOL_CIRCLE, &CEasyDrawView::OnToolCircle)
	ON_UPDATE_COMMAND_UI(ID_TOOL_LINE, &CEasyDrawView::OnUpdateToolLine)
	ON_UPDATE_COMMAND_UI(ID_TOOL_RECT, &CEasyDrawView::OnUpdateToolRect)
	ON_UPDATE_COMMAND_UI(ID_TOOL_CIRCLE, &CEasyDrawView::OnUpdateToolCircle)
	ON_WM_ERASEBKGND()
	ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()

/******************************************************************************
*	作用:		构造函数
******************************************************************************/
CEasyDrawView::CEasyDrawView()
{
	m_bStartDraw = false;
	m_nGraphType = EG_LINE;
}

/******************************************************************************
*	作用:		析构函数
******************************************************************************/
CEasyDrawView::~CEasyDrawView()
{
	EasyGraphics* graph = NULL;

	for (INT_PTR i = 0; i < m_GraphAry.GetCount(); i++)
	{
		graph = (EasyGraphics*)m_GraphAry[i];
		SAFE_DELETE (graph);
	}
}

/******************************************************************************
*	作用:		重绘视图
*	参数:		
		pDC		上下文设备CDC指针
******************************************************************************/
void CEasyDrawView::OnDraw(CDC* pDC)
{
	CEasyDrawDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	CRect rect;
	GetClientRect(rect);

	CDC memDC;
	CBitmap MemBitmap;

	// 设备描述表初始化
	memDC.CreateCompatibleDC(NULL);

	// 建立与屏幕显示兼容的内存显示设备
	MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

	// 选取空白位图
	memDC.SelectObject(MemBitmap);
	memDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(255,255,255));

	EasyGraphics* graph = NULL;

	// 逐个绘制图形容器中的图形
	for (INT_PTR i = 0; i < m_GraphAry.GetCount(); i++)
	{
		graph = (EasyGraphics*)m_GraphAry[i];
		DrawGraphics(&memDC, graph);
	}

	pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
}


// CEasyDrawView 打印

BOOL CEasyDrawView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// 默认准备
	return DoPreparePrinting(pInfo);
}

void CEasyDrawView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加额外的打印前进行的初始化过程
}

void CEasyDrawView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: 添加打印后进行的清除过程
}


// CEasyDrawView 诊断

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

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

CEasyDrawDoc* CEasyDrawView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CEasyDrawDoc)));
	return (CEasyDrawDoc*)m_pDocument;
}
#endif //_DEBUG

/******************************************************************************
*	作用:		绘制一个图形
*	参数:		
*		pDC		上下文设备CDC指针
*		graph	图形对象指针
*	备注:		具体绘制方法根据图形类型确定
******************************************************************************/
void CEasyDrawView::DrawGraphics(CDC* pDC, EasyGraphics* graph)
{
	LOGBRUSH logBrush;
	logBrush.lbStyle = BS_SOLID;
	logBrush.lbColor = graph->m_clrColor;
	CPen pen(graph->m_nLineType |PS_GEOMETRIC|PS_ENDCAP_ROUND, 
			 graph->m_nLineWidth, &logBrush);

	// 选中新的笔对象
	CPen*	oldPen = pDC->SelectObject(&pen);
	
	// 使用透明画刷
	CBrush* oldBrush = (CBrush*)pDC->SelectStockObject(NULL_BRUSH); 

	switch (graph->m_nType)
	{
	case EG_RECT:		
		// 绘制矩形
		pDC->Rectangle(graph->m_PtTopLeft.x, 
					   graph->m_PtTopLeft.y,
					   graph->m_PtBottomRight.x,
					   graph->m_PtBottomRight.y);
		break;

	case EG_CIRCLE:		
		// 绘制椭圆
		pDC->Ellipse(graph->m_PtTopLeft.x, 
					 graph->m_PtTopLeft.y,
					 graph->m_PtBottomRight.x,
					 graph->m_PtBottomRight.y);
		break;

	default:			
		// 绘制直线
		pDC->MoveTo(graph->m_PtTopLeft);
		pDC->LineTo(graph->m_PtBottomRight);
	}

	pDC->SelectObject(oldPen);
	pDC->SelectObject(oldBrush);
}

/******************************************************************************
*	作用:		用户选中“工具”下的“直线工具”时的响应函数
******************************************************************************/
void CEasyDrawView::OnToolLine()
{
	m_nGraphType = EG_LINE;
}


/******************************************************************************
*	作用:		用户选中“工具”下的“矩形工具”时的响应函数
******************************************************************************/
void CEasyDrawView::OnToolRect()
{
	m_nGraphType = EG_RECT;
}


/******************************************************************************
*	作用:		用户选中“工具”下的“椭圆工具”时的响应函数
******************************************************************************/
void CEasyDrawView::OnToolCircle()
{
	m_nGraphType = EG_CIRCLE;
}

/******************************************************************************
*	作用:		“直线工具”的动态更新函数
******************************************************************************/
void CEasyDrawView::OnUpdateToolLine(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nGraphType == EG_LINE);
}

/******************************************************************************
*	作用:		“矩形工具”的动态更新函数
******************************************************************************/
void CEasyDrawView::OnUpdateToolRect(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nGraphType == EG_RECT);
}

/******************************************************************************
*	作用:		“椭圆工具”的动态更新函数
******************************************************************************/
void CEasyDrawView::OnUpdateToolCircle(CCmdUI *pCmdUI)
{
	pCmdUI->SetCheck(m_nGraphType == EG_CIRCLE);
}


/******************************************************************************
*	作用:		视图中按下鼠标左键的响应函数
******************************************************************************/
void CEasyDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{
	m_bStartDraw = true;
	m_PtPress = m_PtLast = point;
}

/******************************************************************************
*	作用:		视图中释放鼠标左键的响应函数
*	备注:		创建图形对象
******************************************************************************/
void CEasyDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
	CDrawToolDlg* dlg = CMainFrame::GetDrawTool();

	if (m_bStartDraw)
	{
		// 创建新图形对象
		EasyGraphics* graph = new EasyGraphics;

		// 对图形属性赋值
		graph->m_nType = m_nGraphType;
		graph->m_clrColor = dlg->GetLineColor();
		graph->m_nLineType = dlg->GetLineType();
		graph->m_nLineWidth = dlg->GetLineWidth();
		graph->m_PtTopLeft = m_PtPress;
		graph->m_PtBottomRight = point;

		// 添加到图形容器中
		m_GraphAry.Add(graph);

		// 一个绘制结束
		m_bStartDraw = false;

		// 让视图重绘
		Invalidate();
	}
}

/******************************************************************************
*	作用:		视图中移动鼠标的响应函数
*	备注:		绘制移动轨迹过程
******************************************************************************/
void CEasyDrawView::OnMouseMove(UINT nFlags, CPoint point)
{
	if (m_bStartDraw)
	{
		CDC* pDC = GetDC();
		int nDrawMode = pDC->SetROP2(R2_NOTXORPEN);		// 设置为“异或模式”
		CDrawToolDlg* dlg = CMainFrame::GetDrawTool();
		EasyGraphics* graph = new EasyGraphics;			// 临时绘制对象

		// 对图形属性赋值
		graph->m_nType = m_nGraphType;
		graph->m_clrColor = dlg->GetLineColor();
		graph->m_nLineType = dlg->GetLineType();
		graph->m_nLineWidth = dlg->GetLineWidth();
		graph->m_PtTopLeft = m_PtPress;
		graph->m_PtBottomRight = m_PtLast;
		DrawGraphics(pDC, graph);	// 擦除上次绘制图形

		graph->m_PtBottomRight = point;
		DrawGraphics(pDC, graph);	// 绘制新图形

		m_PtLast = point;			// 保存当前鼠标坐标
		pDC->SetROP2(nDrawMode);

		SAFE_DELETE (graph);
		ReleaseDC(pDC);
	}

	CView::OnMouseMove(nFlags, point);
}


/******************************************************************************
*	作用:		禁止背景重绘,防止画面闪烁
******************************************************************************/
BOOL CEasyDrawView::OnEraseBkgnd(CDC* pDC)
{
	return TRUE;
//	return CView::OnEraseBkgnd(pDC);
}

⌨️ 快捷键说明

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