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

需要手写的代码都在图片下面,实际内容不多------嘻嘻。
1.打开VS–新建项目–选择mfc应用程序

2.选择单文档,mfc标准,静态库–点击完成

3.设置初始变量(先点击CCSDNView,按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 CCSDNView::OnDrawLineSegment()
{// TODO: 在此添加命令处理程序代码m_DrawType = DrawType::LineSetgment;
}void CCSDNView::OnDrawRectangle()
{// TODO: 在此添加命令处理程序代码m_DrawType = DrawType::Rectangle;
}void CCSDNView::OnDrawCircle()
{// TODO: 在此添加命令处理程序代码m_DrawType = DrawType::Circle;
}void CCSDNView::OnDrawEllips()
{// TODO: 在此添加命令处理程序代码m_DrawType = DrawType::Ellips;}void CCSDNView::OnSetColor()
{// TODO: 在此添加命令处理程序代码CColorDialog dlg;if (IDOK == dlg.DoModal()) {m_PenColor = dlg.GetColor();}
}void CCSDNView::OnSetPenSize()
{// TODO: 在此添加命令处理程序代码CSetPenSizeDialog dlg;if (IDOK == dlg.DoModal()){this->m_PenSize = dlg.m_PenSize2;}
}void CCSDNView::OnSetPencil()
{// TODO: 在此添加命令处理程序代码m_DrawType = DrawType::Pencil;
}void CCSDNView::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

需要源代码的可以私聊我

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

  1. MFC基于单文档制作吹彩色泡泡程序

    1.代码如下: // 吹彩色泡泡Doc.h : interface of the CMyDoc class // /#if !defined(AFX_DOC_H__559CF0A7_41F7_48A5 ...

  2. 基于单文档的MFC程序

    单文档 XXXX = CMy02_MFCTest class XXXXApp : public CWinAppEx 应用程序类//程序入口地址 CMainFrame:CFrameWnd : 框架类 X ...

  3. MFC 基于多文档的打印和打印预览功能的实现

    一.基础知识 1 网上有很多的关于打印的程序,一定要看清楚,是基于对话框dialog的打印功能,还是基于文档的打印功能. 如果分不清基于对话框和文档的区别,建议新建一个单文档.多文档和对话框的工程,看 ...

  4. Windows编程与MFC # 4 单文档应用程序(1)

    整理自VC++程序设计课程课件 使用VC++的应用程序向导MFC AppWizard可以开发: Single document(单文档) Multiple document(多文档) Dialog b ...

  5. MFC基于多文档框架(对话框内嵌office控件(word文档))

    office系列以简便.功能强大的特色发展为当今世界上范围最广.用户最多的办公软件,同时也深受码农的喜欢-.   MFC项目中嵌入office系列软件也是随处可见的,最早接触内嵌office软件是在几 ...

  6. MFC创建单文档工程(左上角名称前的mfc图标修改为其他需求图标)

    资源视图--VT_Ards.rc--右键选择添加资源,选择menu,然后导入 (提前最好把ico图标放到工程文件下的res文件夹下) 图标属性ID为:IDR_MAINFRAME

  7. MFC中 单文档程序 删除工具栏

    方法一 .在创建工程的过程中可通过Docking toolbar 选择不生成工具栏. 方法二 .已经生成工具栏以后可以使用 ShowControlBar(&m_wndToolBar,FALSE ...

  8. 基于MFC单文档的画图程序(小项目)

    基于MFC单文档的画图程序 前言 学习了一年多的MFC和Qt,对其基本用法已经熟练掌握,迫不及待的想实战一波,但是心急吃不了热豆腐,我还是踏踏实实的找一些既能复习以前知识的单子又不消耗我太多时间(最近 ...

  9. MFC应用程序类型:单文档、多文档与基于对话框

    单文档:记事本类程序的标准模式,有菜单栏.工具栏等,只能进行一份文档的操作,即不能同时在同一个应用程序中打开两个文件 多文档:WORD类或浏览器程序的标准模式,可多个窗口显示不同的信息,进行不同的任务 ...

最新文章

  1. c 语言 多进程,VC++中进程与多进程管理的方法详解
  2. First Chapter--Getting Started With Testing
  3. Photoshop CC2018软件安装资料及教程
  4. 深入理解分布式技术 - 服务注册与发现背后的逻辑
  5. jedis对redis键加锁+解锁+事务提交
  6. SQL2008附加数据库只读怎么修改
  7. hog函数的用法 python_Python中的基本函数及常用用法简析
  8. spring-boot-starter-parent和spring-boot-dependencies的作用
  9. 中国主要水系、河流、湖泊数据矢量数据(shp格式)下载地址
  10. NFT游戏有哪些?盘点当前热门的NFT游戏
  11. lch 儿童围棋课堂 初级篇1 ( (李昌镐 著))
  12. 计算机一级程测试题,2017计算机全国一级考试选择题整理.doc
  13. AI芯片:寒武纪NPU设计分析(DianNao)
  14. Python爬虫练习:去爬某平台音乐
  15. 每天一个CSS小特效,文字闪烁——【钢铁侠:爱你三千遍】
  16. 头歌 Java实训答案 全ac代码 请善用目录功能
  17. 第五章 留数及其应用
  18. ucharts动态渲染数据
  19. mac文件共享连不上服务器,mac服务器文件夹共享权限设置
  20. 直接import carla

热门文章

  1. 电脑数据迁移到新电脑:一键迁移数据方案详解
  2. 论文阅读 (78):FlowNet: Learning Optical Flow with Convolutional Networks
  3. MySQL5.6与5.7的区别——及MySQL5.6版本安装
  4. 腾讯文档服务器异常怎么回事,腾讯文档怎么编辑不了 编辑不了解决方法
  5. ffmpeg开发之旅(4):MP3编码格式分析与lame库编译封装
  6. 手把手教你python实现量价形态选股知乎_如何通过量价形态选股
  7. model3充电方式_Model3 电池最佳充电和使用详细说明
  8. 云适配陈本峰:HTML5并非真正跨平台
  9. Android开机启动速度优化 app启动速度优化
  10. 《PyInstaller打包实战指南》第九节 应用程序安全