MFC基于单文档实现绘图功能(线段,矩形,椭圆,圆,铅笔,橡皮),保姆式教程

MFC基于单文档实现绘图功能(线段,矩形,椭圆,圆,铅笔,橡皮),保姆式教程

需要手写的代码都在图片下面,实际内容不多------嘻嘻。
1.打开VS–新建项目–选择mfc应用程序
在这里插入图片描述
2.选择单文档,mfc标准,静态库–点击完成
在这里插入图片描述
3.设置初始变量(先点击C优快云View,按F12转到声明)在这里插入图片描述

public:
	int m_PenSize;
	COLORREF m_PenColor, m_BrushColor;
	CPoint m_PointBegin, m_PointEnd;

	enum class DrawType {
		LineSetgment, Circle, Rectangle, Ellips, Pencil, Eraser

4.赋初始值在这里插入图片描述

m_PenSize = 1;
	m_PenColor=RGB(0,0,0), 
	m_BrushColor = RGB(0, 0, 0);
	m_PointBegin = CPoint(0, 0);
	m_PointEnd = CPoint(0, 0);
	m_DrawType = DrawType::LineSetgment;

5.鼠标响应在这里插入图片描述
6.添加程序
在这里插入图片描述

m_PointBegin = m_PointEnd = point;

	/*CClientDC dc(this);
	dc.MoveTo(m_PointBegin);
	dc.LineTo(m_PointEnd);
*/

	CView::OnLButtonDown(nFlags, point);

7.重复第5步,依次建立其他鼠标响应消息在这里插入图片描述
8.添加OnMouseMove代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

if (nFlags & MK_LBUTTON)
	{

		CClientDC dc(this);
		CPen newPen, *oldPen;
		newPen.CreatePen(PS_SOLID, m_PenSize, m_PenColor);
		oldPen = dc.SelectObject(&newPen);

		switch (m_DrawType)
		{
			case DrawType::LineSetgment:
			{
				dc.SetROP2(R2_NOTXORPEN);
				dc.MoveTo(m_PointBegin);
				dc.LineTo(m_PointEnd);

				dc.MoveTo(m_PointBegin);
				dc.LineTo(point);

				m_PointEnd = point;

				break;
			}
			case DrawType::Rectangle:
			{dc.SetROP2(R2_NOTXORPEN);
			dc.SelectStockObject(5);

			CRect rectP1(m_PointBegin, m_PointEnd);
			dc.Rectangle(rectP1);

			CRect rectP2(m_PointBegin, point);
			dc.Rectangle(rectP2);

			m_PointEnd = point;

			break;
			}
			case DrawType::Pencil:
			{
				m_PointBegin = m_PointEnd;
				m_PointEnd = point;
				dc.MoveTo(m_PointBegin);
				dc.LineTo(m_PointEnd);
				break;
			}
			case DrawType::Eraser:
			{
				COLORREF pColor = dc.GetBkColor();
				CPen newPen(PS_SOLID, m_PenSize, pColor);
				dc.SelectObject(&newPen);
				m_PointBegin = m_PointEnd;
				m_PointEnd = point;
				dc.MoveTo(m_PointBegin);
				dc.LineTo(m_PointEnd);
				break;
			}
			case DrawType::Ellips:
			{dc.SetROP2(R2_NOTXORPEN);
			dc.SelectStockObject(5);

			CRect rectP1(m_PointBegin, m_PointEnd);
			dc.Ellipse(rectP1);

			CRect rectP2(m_PointBegin, point);
			dc.Ellipse(rectP2);

			m_PointEnd = point;

			break;
			}
			case DrawType::Circle:
			{
				dc.SetROP2(R2_NOTXORPEN);
				dc.SelectStockObject(5);

				int length_1 = m_PointEnd.y - m_PointBegin.y;
				if (m_PointEnd.x<m_PointBegin.x)
				{
					m_PointEnd.x = m_PointBegin.x - abs(length_1);

				}
				else
				{
					m_PointEnd.x = m_PointBegin.x + abs(length_1);
				}

				CRect rectP1(m_PointBegin, m_PointEnd);
				dc.Ellipse(rectP1);

				int length_2 = point.y - m_PointBegin.y;
				if (point.x<m_PointBegin.x)
				{
					m_PointEnd.x = m_PointBegin.x - abs(length_2);

				}
				else
				{
					m_PointEnd.x = m_PointBegin.x + abs(length_2);
				}
				m_PointEnd.y = point.y;

				CRect rectP2(m_PointBegin, m_PointEnd);
				dc.Ellipse(rectP2);

				m_PointEnd = point;

				break;
			}
			default:
				break;
		}
		dc.SelectObject(oldPen);
	}
			

9.添加OnLButtonUp程序
在这里插入图片描述
在这里插入图片描述

CClientDC dc(this);
	CPen newPen, *oldPen;
	newPen.CreatePen(PS_SOLID, m_PenSize, m_PenColor);
	oldPen = dc.SelectObject(&newPen);

	switch (m_DrawType)
	{
	case DrawType::LineSetgment:
	{

		dc.MoveTo(m_PointBegin);
		dc.LineTo(point);

		break;
	}
	case DrawType::Rectangle:
	{

		dc.SelectStockObject(PS_NULL);
		CRect rectP2(m_PointBegin, point);
		dc.Rectangle(rectP2);
		break;
	}
	case DrawType::Pencil:
	{
		m_PointBegin = m_PointEnd;
		m_PointEnd = point;
		dc.MoveTo(m_PointBegin);
		dc.LineTo(m_PointEnd);
		break;
	}
	case DrawType::Ellips:
	{

		dc.SelectStockObject(PS_NULL);
		CRect rectP2(m_PointBegin, point);
		dc.Ellipse(rectP2);
		break;
	}

	default:
		break;

	}
	dc.SelectObject(oldPen);

10.点击菜单进行编辑添加
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
11.事件处理
在这里插入图片描述
在这里插入图片描述
重复这个过程,将其他的事件处理也添加进去
一定要设置为view类,除了命名不同,其他都相同
线:LineSetgment
矩形:OnDrawRectangle
圆:OnDrawCircle
椭圆:OnDrawEllips
画笔颜色:OnSetColor
画笔粗细:OnSetPenSize
铅笔:OnSetPencil
橡皮:OnSetEraser

12.添加事件处理程序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

void C优快云View::OnDrawLineSegment()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DrawType::LineSetgment;
}


void C优快云View::OnDrawRectangle()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DrawType::Rectangle;
}


void C优快云View::OnDrawCircle()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DrawType::Circle;
}


void C优快云View::OnDrawEllips()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DrawType::Ellips;
	
}


void C优快云View::OnSetColor()
{
	// TODO: 在此添加命令处理程序代码
	CColorDialog dlg;
	if (IDOK == dlg.DoModal()) {
		m_PenColor = dlg.GetColor();

	}
}


void C优快云View::OnSetPenSize()
{
	// TODO: 在此添加命令处理程序代码
	CSetPenSizeDialog dlg;
	if (IDOK == dlg.DoModal())
	{
		this->m_PenSize = dlg.m_PenSize2;
	}
}


void C优快云View::OnSetPencil()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DrawType::Pencil;
}


void C优快云View::OnSetEraser()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DrawType::Eraser;
}

13.添加两个头文件
在这里插入图片描述

#include"resource.h"
#include"SetPenSizeDialog.h"

14.添加资源
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
15.右击对话框,点击添加类
在这里插入图片描述
在这里插入图片描述
再回到这个页面,添加变量
在这里插入图片描述
15.添加程序
在这里插入图片描述
在这里插入图片描述

CString str;
	m_Edit.GetWindowTextW(str);
	m_PenSize2 = _ttoi(str);

16.完成,运行,OK
在这里插入图片描述

需要源代码的可以私聊我

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值