MFC制作简易画板

实验二:简易画

相关变量初始化
CMFCApplication3View::CMFCApplication3View() noexcept
{
	// TODO: 在此处添加构造代码
	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::Line;
	m_count = 3;
	int i = 0;
	// 重写
}
DrawType为枚举变量,用于后面菜单的流程控制
public:
	int m_PenSize;
	int i;
	int m_count;
	CPoint P[10];
	COLORREF m_PenColor, m_BrushColor;
	CPoint m_PointBegin, m_pointEnd;
	enum class DrawType
	{
		Line, Ellipse, Rectangle, Polygon, Freehand , Eraser
	}m_DrawType;
	// 重写
鼠标点击事件,获取当前位置的坐标,当DrawType不为Polygon时初始化为画多边形准备的点集,为Polygon时则向数组中录入当前点击位置
void CMFCApplication3View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_PointBegin = m_pointEnd = point;
	if (m_DrawType != DrawType::Polygon) {
		for (i = 0; i < 10; i++) {
			P[i].x = 0;
			P[i].y = 0;
		}
		i = 0;
	}
	if (m_DrawType == DrawType::Polygon) {
		if (i < 0) {
			i = 0;
		}
		P[i] = point;
		if (i < m_count) {
			i++;
		}
	}
	CView::OnLButtonDown(nFlags, point);
}
鼠标移动事件,通过DrawType控制
void CMFCApplication3View::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	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::Line://画直线
			{
				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::Ellipse://画椭圆
			{
				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::Freehand://自由曲线
			{
				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);
				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;
			}
			default:
				break;
		}

		dc.SelectObject(oldPen);
	}
	CView::OnMouseMove(nFlags, point);
}
鼠标松开事件,主要解决覆盖点无色和绘制多边形
void CMFCApplication3View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this);
	CPen newPen, * oldPen;
	newPen.CreatePen(PS_SOLID, m_PenSize, m_PenColor);
	oldPen = dc.SelectObject(&newPen);
	switch (m_DrawType)
	{
		case DrawType::Line:
		{
			dc.MoveTo(m_PointBegin);
			dc.LineTo(point);
			break;
		}
		case DrawType::Rectangle:
		{
			dc.SelectStockObject(5);
			CRect rectP2(m_PointBegin, point);
			dc.Rectangle(rectP2);
			break;
		}
		case DrawType::Ellipse:
		{
			dc.SelectStockObject(5);
			CRect rectP2(m_PointBegin, point);
			dc.Ellipse(rectP2);
			break;
		}
		case DrawType::Eraser:
		{
			COLORREF pColor = dc.GetBkColor();
			CPen newPen(PS_SOLID, m_PenSize, pColor);
			dc.SelectObject(&newPen);
			CRect rectP2(m_PointBegin, point);
			dc.Rectangle(rectP2);
			break;
		}
		case DrawType::Polygon:
		{
			if (i == m_count) {//在点集录入点的个数不够时不执行
				dc.SetROP2(R2_NOTXORPEN);
				dc.SelectStockObject(5);
				dc.Polygon(P, m_count);
				for (i = 0; i < m_count; i++)
				{
					P[i].x = 0;
					P[i].y = 0;
				}
				i = 0;
			}
			break;
		}
		default:
			break;
	}
	dc.SelectObject(oldPen);
	CView::OnLButtonUp(nFlags, point);
}
相关菜单对应事件,通过改变DrawType来达到目的
void CMFCApplication3View::OnDrawLine()
{
	m_DrawType = DrawType::Line;
	// TODO: 在此添加命令处理程序代码
}


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


void CMFCApplication3View::OnDrawEllipse()
{
	m_DrawType = DrawType::Ellipse;
	// TODO: 在此添加命令处理程序代码
}


void CMFCApplication3View::OnDrawPol()
{
	m_DrawType = DrawType::Polygon;
	// TODO: 在此添加命令处理程序代码
	CSetPolygon dlg;
	if (IDOK == dlg.DoModal()) {
		m_count = dlg.m_count;
	}
}


void CMFCApplication3View::OnSetSize()
{
	// TODO: 在此添加命令处理程序代码
	CSetPenSizeDialog dlg;
	if (IDOK == dlg.DoModal()) {
		m_PenSize = dlg.m_PenSize;
	}
}


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


void CMFCApplication3View::OnDrawFreehand()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DrawType::Freehand;
}


void CMFCApplication3View::OnDrawEraser()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DrawType::Eraser;
}
菜单设计

在这里插入图片描述
在这里插入图片描述

编辑框数据传入
void CSetPolygon::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT1, m_Edit2);
	CString str;
	m_Edit2.GetWindowTextW(str);
	m_count = _ttoi(str);
}
void CSetPenSizeDialog::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_EDIT2, m_Edit);

	CString str;
	m_Edit.GetWindowTextW(str);
	m_PenSize = _ttoi(str);
}
展示

在这里插入图片描述

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值