news 2026/7/19 6:24:34

MFC实现画图菜单小程序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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.

voidCTest22View::OnDrawLine(){// TODO: 在此添加命令处理程序代码m_DrawType=DT_LINE;}voidCTest22View::OnDrawRect(){// TODO: 在此添加命令处理程序代码m_DrawType=DT_RECT;}voidCTest22View::OnDrawEllipse(){// TODO: 在此添加命令处理程序代码m_DrawType=DT_ELLIPSE;}voidCTest22View::OnDrawPen(){// TODO: 在此添加命令处理程序代码m_DrawType=DT_PEN;}voidCTest22View::OnLButtonDown(UINT nFlags,CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值if(m_DrawType==DT_PEN){m_bDraw=true;}m_pOrigin=point;CView::OnLButtonDown(nFlags,point);}voidCTest22View::OnLButtonUp(UINT nFlags,CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值CClientDCdc(this);////创建笔 (实线,宽度2,颜色)CPenpen(PS_SOLID,2,RGB(100,10,199));//默认保存至pOldPen,设备选择新的笔CPen*pOldPen=dc.SelectObject(&pen);switch(m_DrawType)//分辨激活的是哪个操作{caseDT_LINE://画线dc.MoveTo(m_pOrigin);dc.LineTo(point);break;caseDT_RECT://换矩形dc.Rectangle(CRect(m_pOrigin,point));break;caseDT_ELLIPSE://画椭圆dc.Ellipse(CRect(m_pOrigin,point));break;caseDT_PEN:m_bDraw=false;//鼠标抬起结束画笔break;default:break;}CView::OnLButtonUp(nFlags,point);}voidCTest22View::OnMouseMove(UINT nFlags,CPoint point){// TODO: 在此添加消息处理程序代码和/或调用默认值if(m_DrawType==DT_PEN&&m_bDraw==true){CClientDCdc(this);CPenpen(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);}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/19 6:24:27

C++社区康养系统开发实战:架构设计与性能优化

1. 项目概述与背景解析最近几年,社区康养服务在国内的需求增长非常快。我身边不少朋友都在参与相关项目,从简单的健康档案管理,到整合了智能设备、预约服务、紧急呼叫的综合性平台,需求五花八门。这次要聊的,就是一个用…

作者头像 李华
网站建设 2026/7/19 6:24:19

从 0 搭一个 SERP API:Google 搜索结果结构化到底有哪些坑

前阵子花了大概三周时间,从零写了一个 Google SERP 的解析层。一开始觉得这事不难——不就是抓 HTML 写解析器嘛,CSS selector 一把梭。结果一脚踩进去,坑连着坑。这篇记一下,给后面想做类似事的人一个参考。 下面以 SerpBase 的…

作者头像 李华
网站建设 2026/7/19 6:23:51

MoveIt!实战入门:面向真实机械臂的运动规划配置指南

1. 这不是“又一个ROS教程”,而是一份给真实机器人开发者的MoveIt!启动地图你打开ROS Wiki,点开MoveIt!文档,页面上密密麻麻的“Configuration Assistant”、“Planning Scene Monitor”、“Motion Planning API”……再往下翻,是…

作者头像 李华
网站建设 2026/7/19 6:23:43

基于Unity ML-Agents与MA-POCA的多智能体足球强化学习实战

1. 项目概述:当AI学会踢足球如果你玩过或了解过《FIFA》或《实况足球》这类游戏,可能会对其中球员的AI行为印象深刻——他们会跑位、传球、协防。但你想过没有,如果这些球员不是由预设的脚本控制,而是由一个个独立的“大脑”通过学…

作者头像 李华
网站建设 2026/7/19 6:23:14

PX4编译系统解析:从CMake到固件生成的完整流程

1. 项目概述:PX4编译系统的核心机制每次在PX4项目目录下输入make px4_fmu-v4_default这样的命令时,背后其实触发了一整套复杂的编译工具链协作过程。这个看似简单的命令实际上完成了从源码到可执行固件的完整转换,涉及CMake配置生成、交叉编译…

作者头像 李华
网站建设 2026/7/19 6:22:50

AM62L Cortex调试配置寄存器:深入理解CSWREG、TAREG与DRWREG

1. 深入理解AM62L Cortex调试配置寄存器的核心价值在嵌入式系统开发,尤其是基于TI AM62L这类复杂多核Sitara™处理器的项目中,调试和底层配置能力往往是决定项目成败的关键。很多开发者习惯于依赖高级的IDE和调试器,但当系统在启动早期崩溃、…

作者头像 李华