作业要求:

按下鼠标右键画圆。

按下鼠标左键移动曲线。

丝毫没有思路。。网上教程又比这个程序复杂100倍...

好吧 总算找到一个合适的了...

转载至:http://blog.chinaunix.net/uid-26275986-id-3868272.html 红色字部分是我自己的注解

学习MFC就像玩魔术,着实有趣,从传统的黑白命令行跳到熟悉的窗口界面,感觉还是很新鲜的。尽管MFC的知识更多是应用性的,但是自己还是想尽快掌握起来独立地写出图形接口的程序。今天学习的是如何绘制简单的图形,比如直线;当然后面还有高级绘图,但是那些部分对于自己现在就没有多少必要了:自己需要的是GUI,而非全部的MFC。所以接下来自己会挑几个感觉重要的、需要的部分来学习,目标就是看完这些之后自己可以写出一个图形小程序。
     言归正传,如果想在窗口上绘制直线的话,我们需要捕捉两个点:线段的起点和终点。二者可以分别通过WM_LBUTTONDOWN和WM_LBUTTONUP来实现。类似于上节课讲述的添加消息函数的方法,在类视图的CDrawView右键属性,选择“消息”菜单,找到对应的消息即可。进入二者的消息函数的实现之前,需要定义一个变量表示线段的起点CPoint m_ptOrigin,同样是右键View类添加变量即可:

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值//MessageBox(L"View Clicked!");     //用于单击窗口客户区时的测试m_ptOrigin = point;CView::OnLButtonDown(nFlags, point);
}void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值//使用CDC类实现CDC *pDC = GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);CView::OnLButtonUp(nFlags, point);
}

1.

m_ptOrigin = point;

简单明了..估计的意义就是point形参读取了当前的鼠标位置,将其复制给全局变量m_ptOrigin

2.

    CDC *pDC = GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);

利用GetDC()得到一个封装类CDC (虽然并不懂CDC是什么东西),估计就是当前绘画的操作把;

MoveTo LineTo在上一篇中介绍过啦~~~

ReleaseDC();释放掉,防止溢出..

上面的代码使用了设备描述表(DC)来实现绘制直线。MS为程序猿提供了应用程序与设备交互的数据结构DC(Device Context)以实现程序的平台无关性。可以使用直接的DC,也可以使用DC的封装类CDC实现,上面都给出了示例。当然,更加简便地是使用CDC的派生类CClientDC,可以不用自己却写GetDC和ReleaseDC函数。运行测试结果如下:

细心的童鞋会发现上面的程序只能绘制直线,那如何绘制连续线呢?其实这里的关键在于实现的想法,如果我们把曲线看作许多小线段的组合,那么每次更新起点连续绘制小线段不就可以了么?但是这里需要注意的是我们需要一个Bool m_bDraw来判断鼠标是否点下是否应当一直绘制。我们需要使用WM_MOUSEMOVE来捕捉鼠标的不断移动:

void CDrawView::OnLButtonDown(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值//MessageBox(L"View Clicked!");m_ptOrigin = point;m_bDraw = true;CView::OnLButtonDown(nFlags, point);
}void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值m_bDraw = false;CView::OnLButtonUp(nFlags, point);
}void CDrawView::OnMouseMove(UINT nFlags, CPoint point)
{// TODO: 在此添加消息处理程序代码和/或调用默认值CClientDC dc(this);//创建一个画笔CPen pen(PS_SOLID, 1, RGB(255, 0,0));//将创建的画笔选入设备描述表CPen *pOldPen = dc.SelectObject(&pen);if (m_bDraw == true){dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin = point ;  //每次都更新起点}CView::OnMouseMove(nFlags, point);
}

这样我们就可以绘制曲线了:)

1.

m_bDraw = true;
<pre name="code" class="cpp" style="font-size: 13.3333339691162px;">m_bDraw = false;

判断鼠标是否保持点击状态..

2.

    CClientDC dc(this);//创建一个画笔CPen pen(PS_SOLID, 1, RGB(255, 0,0));//将创建的画笔选入设备描述表CPen *pOldPen = dc.SelectObject(&pen);

CClientDC 据百度百科说,是继承与CDC的..等下用CDC 试试..

    if (m_bDraw == true){dc.MoveTo(m_ptOrigin);dc.LineTo(point);m_ptOrigin = point ;  //每次都更新起点}

然后画画就好啦`

亲测用CDC也是一样的..只是省略的GetDC,和ReleaseDC;

 CDC *pDC=GetDC();//创建一个画笔CPen pen(PS_SOLID, 1, RGB(255, 0,0));//将创建的画笔选入设备描述表pDC->SelectObject(&pen);if (m_bDraw == true){pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);m_ptOrigin = point ;  //每次都更新起点}ReleaseDC(pDC);CView::OnMouseMove(nFlags, point);

恩 文章结束!我也类比用右键做个圆!

类似上面的写法 ,创建一个WM_RButtonDown,WM_RButtonUp;

然后读起点读终点画圆就好啦!。

代码就懒得放了 ,so easy ,我果然还是有点小天赋~

转载于:https://www.cnblogs.com/zy691357966/p/5480354.html

【MFC学习笔记-作业7-小型画图软件】【】相关推荐

  1. C++ MFC 学习笔记+小型通讯录系统实现

    MFC 最详细入门教程 [MFC常用函数总结](https://www.cnblogs.com/jiu0821/p/4606639.html) [C++ & MFC]https://www.c ...

  2. 计算机图形学 | 基于MFC和二维变换的画图软件

    文章目录 基于MFC和二维变换的画图软件 摘 要 设 计 1 程序总体结构 1.1 总体结构设计 1.1.1 绘图设计 1.1.2 变换设计 2 程序实现 2.1 鼠标绘图的消息映射 2.2 图形绘制 ...

  3. MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

    MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 (这是因为这个全局对象,基类CWinApp中 this ...

  4. 深入浅出MFC学习笔记

    深入浅出MFC学习笔记 ithzhang CSDN博客:http://blog.csdn.net/ithzhang/article/category/1159054 转载于:https://blog. ...

  5. 影像组学视频学习笔记(34)-使用3D Slicer软件提取影像组学特征、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/afcd06221ea4 来源:简书,已获授权转载 RadiomicsWorld.com "影像组学世界" ...

  6. 《微信小程序商城界面设计实战》--学习笔记作业

    一.学习笔记 1.注释:wxml文档注释: css文档注释:/** **/ js文档注释:单行注释以"//"开头:多行注释以"/"开头,以"/&quo ...

  7. CS61A学习笔记(作业篇)

    为了制止我半途而废,以及散落各处找不到的笔记,决定在这里记录学习笔记和作业遇到的困难等等. Lab 03 Q4: Repeated, repeated In Homework 2 you encoun ...

  8. MFC学习笔记(一)High Speed Chart 控件使用

    引言 大学期间学习STM32时,由于参加机器人比赛,第一次接触到摄像头,让我深深被其吸引,还记得当初为了点亮第一颗摄像头,第一次通过自己写的颜色识别算法让它按照自己的意愿去识别出每帧图像的内容,正确标 ...

  9. C++ MFC学习笔记(第三课)绘制统计直方图

    绘制统计直方图 在第二节课,用单文档程序实现鼠标画线画图后,第三节课学习了用单文档程序画统计直方图.最终效果如下.这里以统计成绩人数的为例. 1.限定直方图大小 我们先创建绘制直方图的函数,下面的代码 ...

  10. OpenCV+MFC学习笔记(二):OpenCV二值化处理图像并在Picture Control中并自适应显示

    在前面我们已经完成通过OpenCV读取图片在Picture Control中并自适应显示.下面我们很自然的需要对读取的图片进行处理,处理完之后很自然的想到要看看效果.所以今天的笔记是通过OpenCV灰 ...

最新文章

  1. 团队作业4——第一次项目冲刺(Alpha版本)4.28
  2. python 检测文件或文件夹是否存在
  3. a href=# 与javascript:void(0)的区别
  4. python for循环中累加变量是否要清零
  5. Spring Cloud(F版)搭建高可用服务注册中心
  6. 全新OpenMMLab邀你入伙 共创AI开源世界
  7. HDU2522 A simple problem【分数与小数】
  8. python语言是二进制语言吗_在大型项目上,Python 是个烂语言吗?
  9. su灯光插件_V-Ray for SketchUp渲染外部照明快速入门
  10. 又见猛犸象:基因剪刀重新定制生命
  11. Java程序员工资为什么越来越高?
  12. 服务器托管双线技术方案
  13. 简单计算器 求一元二次方程的根
  14. dede标签云(TAG)随机颜色及大小的实现方法
  15. 推荐几个值得关注的公众号平台
  16. 某侦察队接到一项紧急任务,要求在A、B、C、D、E、F六个队员中尽可能多地挑若干人,但有以下限制条件: 1)A和B两人中至少去一人; 2)A和D不能一起去; 3)A、E和F三人中要派两人去; 4)B和
  17. BST、AVL、BTree、B+Tree、B*Tree、23Tree、234Tree、TTree、RBTree、LLRBTree、AATree、SplayTree、Treap、无旋Treap、scap
  18. GCN学习:Pytorch-Geometric教程(二)
  19. Javascript脚本运行的方式(js写在页面什么地方)
  20. 怎么配置java环境_idea配置java环境

热门文章

  1. C#winform初试报表
  2. ActiveReports 9 新功能:创新的报表分层设计理念
  3. 电脑蓝屏后你该做的几桩要事
  4. gsoap使用心得![转]
  5. vue使用element案列
  6. 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析
  7. 2017/4/27 morning
  8. 生成验证码封装(新版)
  9. Windows上搭建Git服务器
  10. 6个重要的.NET概念:栈,堆,值类型,引用类型,装箱,拆箱[转]