MFC实现画图菜单小程序

创建程序

创建一个MFC 单个文档的小程序 ,高级功能全都点掉即可.

注:我设置的项目名是 Test_2_2 ,设置的项目存储路径和项目名不要出现中文,可能出现未知异常.

创建文件画图菜单

在资源视图中找到 IDR_MARINFRAME 点击打开

点击 IDR_MARINFRAME 中的输入框属于信息

点击画线选项编辑ID (本人依次编辑的是 ID_DRAW_LINE , ID_DRAW_RECT , ID_DRAW_ELLIPSE , ID_DRAW_PEN)

至此前期的准备完成.

程序分析: 我们要在点击一个选项后在界面上绘制对应的图形,那么点击选项就如同打开了这个绘制的开关一样,所以我们设置4个enum选项来表示要画的图形 在 Test_2_2View.h 文件中 如下图:

如果点击了画线选项,鼠标在界面中,按下左键拖动到另一点松开,两点连线便是要画的线.所以要在Test_2_2View.h 文件中的类CTest22View 中添加鼠标按下时点的位置,画线开关和所画的图形形式

添加四个选项的应命令(如下图)

左键按下抬起消息和鼠标移动消息

WM_LBUTTONDOWN

WM_LBUTTONUP

WM_MOUSEMOVE

参考代码如下:

当你按下画笔选项时, 形式m_DrawType = DT_PEN 切换为画笔形式. 在界面按下鼠标左键时画笔开关m_bDraw设true,并记录此时的位置在m_pOrigin中随着你鼠标移动激活鼠标移动函数 OnMouseMove(UINT nFlags, CPoint point)画线,

鼠标抬起时便会关键开关m_bDraw.

cpp 复制代码
void CTest22View::OnDrawLine()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DT_LINE;
}


void CTest22View::OnDrawRect()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DT_RECT;
}


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


void CTest22View::OnDrawPen()
{
	// TODO: 在此添加命令处理程序代码
	m_DrawType = DT_PEN;
}


void CTest22View::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (m_DrawType == DT_PEN)
	{
		m_bDraw = true;
	}
	m_pOrigin = point;
	CView::OnLButtonDown(nFlags, point);
}


void CTest22View::OnLButtonUp(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	CClientDC dc(this); //
	//创建笔 (实线,宽度2,颜色)
	CPen pen(PS_SOLID, 2, RGB(100, 10, 199));
	//默认保存至pOldPen,设备选择新的笔
	CPen* pOldPen = dc.SelectObject(&pen);

	switch (m_DrawType) //分辨激活的是哪个操作
	{
	case DT_LINE: //画线
		dc.MoveTo(m_pOrigin);
		dc.LineTo(point);
		break;
	case DT_RECT: //换矩形
		dc.Rectangle(CRect(m_pOrigin, point));
		break;
	case DT_ELLIPSE: //画椭圆
		dc.Ellipse(CRect(m_pOrigin, point));
		break;
	case DT_PEN:
		m_bDraw = false; //鼠标抬起结束画笔
		break;
	default:
		break;
	}
	CView::OnLButtonUp(nFlags, point);
}


void CTest22View::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	if (m_DrawType == DT_PEN && m_bDraw == true)
	{
		CClientDC dc(this);
		CPen pen(PS_SOLID, 2, RGB(0, 100, 220));
		CPen* pOldPen = dc.SelectObject(&pen);

		//从起点画一段线到终点
		dc.MoveTo(m_pOrigin);
		dc.LineTo(point);

		//终点变成新的起点
		m_pOrigin = point;

		dc.SelectObject(pOldPen);
	}
	CView::OnMouseMove(nFlags, point);
}
相关推荐
hy.z_77743 分钟前
【C++】9. Vector
开发语言·c++
我能坚持多久1 小时前
优选算法——专题一双指针(上):附四道例题详解
c++·学习·算法
Tim_101 小时前
【C++】023、移动语义&深拷贝
开发语言·c++·算法
ShineWinsu1 小时前
对于C++中unordered_map的详细介绍
数据结构·c++·算法·面试·stl·哈希表·unordered_map
东东最爱敲键盘1 小时前
day3.c++函数与预处理 string
c++·算法
djjjx.2 小时前
【 C++ 】stack、queue、优先级队列、仿函数、容器适配器
开发语言·c++
lingran__2 小时前
C++ 高阶数据结构:AVL 树万字详解|原理、四种旋转、key‑value 实现、调试校验、set/map/红黑树 底层前置知识
数据结构·c++·二叉搜索树·平衡二叉树·avl树·红黑树前置
爱和冰阔落2 小时前
【Linux】两个毫无关系的进程怎么通信?命名管道 FIFO 从原理到 Server/Client 实战
android·linux·数据库·c++·vim
码匠许师傅10 小时前
【C++ 面试真题】C++ 的 const 和 constexpr 有什么区别?
c++·面试
果果燕13 小时前
实习笔记(一):NFS、Samba、VNC、Git、CMake、systemd、内核、交叉编译
linux·arm开发·c++·笔记·git