步骤一:
       在已有的外貌框架中为我们的菜单项鼠标右键添加消息处理程序,用来处理当我们对该菜单项进行点击时能够传递某些东西。
如下图所示:
在这时我们就会看到一个弹出的向导对话框,记住添加的事件处理程序在DrawView类中,这时我们就会发现改ID的好处了,我们就能对这些事件处理程序进行很好的区分,而不是一堆数字。如下图所示:

用同样的方法添加想要处理的程序在这里我就只添加了直线、矩形、椭圆、颜色、设置添加了事件处理程序。
添加了事件处理程序之后我们再次点击运行时我们就会发现原来的灰色菜单项中我们添加了事件处理程序的就不会再显示为灰色。而且在DrawView类中为我们自动生成了一下代码:

void CDrawView::OnLine()
{
 // TODO: 在此添加命令处理程序代码
}

void CDrawView::OnRectangle()
{
 // TODO: 在此添加命令处理程序代码
}

void CDrawView::OnEllipse()
{
 // TODO: 在此添加命令处理程序代码
}

void CDrawView::OnColor()
{
 // TODO: 在此添加命令处理程序代码
}

void CDrawView::OnSetting()
{
 // TODO: 在此添加命令处理程序代码
}

运行效果如图所示:

步骤二:

做了以上这些是不是离这个初步的绘制图形不远了呢,在这章里答案是这样的,但是只在DrawView里画图显然过于不严谨,封装性不够好,为此我建立了图形基类CShape类,然后建立了CRectangle,CEllipse,CLine三个公有继承于CShape的图形子类,以便于相对应相应的菜单项。

如图所示:

步骤三:

做完了这些,我们就可以在这些类里面做些什么了,让这个绘图程序逐渐的鲜活起来。由图形的基本属性所知,绘制一个图形需要一个起点和一个重点,在MFC中这些带有二维属性的点是CPoint类的,所以我们只需在基类CShape中定义两个CPoint类型的变量m_ptOrigin和m_End分别保存起点和终点(变量命名最好见名知意)。同理,我们添加int型变量m_DrawType保存我绘制的类型

添加变量方式如图:

步骤四:绘制图形
        我们先要在DrawView中定义三个相同的变量。然后要在刚添加的时间处理程序中分别对这三种图形的线型进行设置。具体代码如下:

void CDrawView::OnLine()
{
 // TODO: 在此添加命令处理程序代码
 m_DrawType=1; 
}

void CDrawView::OnRectangle()
{
 // TODO: 在此添加命令处理程序代码
 m_DrawType=2;
}

void CDrawView::OnEllipse()
{
 // TODO: 在此添加命令处理程序代码
 m_DrawType=3;
}

做完这些我们当然还是不能绘图。

步骤四:让我们来想一想我们在用微软的画图时是不是鼠标左键点击时才会进行图形的绘制,然后鼠标右键松开时,这个图形便绘制好了呢!所以我们就得利用类向导为我们天加这两个消息的处理。如下图:

步骤五:
        编写绘制图形实现代码,我们可以想象一下,当我们鼠标左键在客户区进行点击时,要把我们点击的点当成绘图的起点,鼠标右键在弹起时记录成终点。然后绘制图形的过程呢便是在鼠标左键点击时到鼠标左键弹起时这一过程绘制的图形,所以我们要在LBottonDown时让我的起点等于传进来的点,实现代码如下:

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

然后在LBottonUp中添加绘制的代码,代码如下:

void CDrawView::OnLButtonUp(UINT nFlags, CPoint point)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 CClientDC dc(this); //创建dc
 CPen pen(PS_SOLID,1,RGB(255,0,0)); //创建绘制的画笔
 CBrush *pbrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); //创建绘制时填充的画刷
 dc.SelectObject(&pen); //将画刷和画笔选入设备描述表中
 dc.SelectObject(pbrush);
 switch (m_DrawType) //根据绘制种类进行绘制
 {
 case 1:
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);
  break;
 case 2:
  dc.Rectangle(CRect(m_ptOrigin,point));
  break;
 case 3:
  dc.Ellipse(CRect(m_ptOrigin,point));
  break;
 default:
  break;
 }
 CView::OnLButtonUp(nFlags, point);
}
运行后就可以绘制图形了,如下图所示:

————————————————
版权声明:本文为CSDN博主「混沌Monkey」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012424783/article/details/25737067

MFC绘图二——简单绘制直线等相关推荐

  1. iOS开发之Quartz2D 二:绘制直线,曲线,圆弧,矩形,椭圆,圆

    #import "DrawView.h"@implementation DrawView/*** 作用:专门用来绘图* 什么时候调用:当View显示的时候调用* @param re ...

  2. 使用MFC进行编程,绘制直线椭圆以及样条曲线

    新建基于MFC的空文件,添加.cpp文件,添加.h文件.相应的文件内容为: hello.h文件 #ifndef __HELLO_H #define __HELLO_H //#include <w ...

  3. AD怎么输入坐标_CAD入门基础小知识(二)捕捉栅格绘制直线amp;使用坐标绘图...

    捕捉栅格绘制直线 摘要:直线是CAD设计图纸中最重要的组成元素,因此,本教程将以直线的绘制引导读者快速入门.栅格捕捉虽然不常用,确实精确定位尺寸最简单的方式,我们先从这种方式开始. 画直线之前,我们先 ...

  4. 《AutoCAD 2016中文版从入门到精通》——第2章 简单二维绘制命令2.1 直线类命令...

    本节书摘来自异步社区<AutoCAD 2016中文版从入门到精通>一书中的第2章,第2.1节,作者: 贾雪艳 , 朱爱华 更多章节内容可以访问云栖社区"异步社区"公众号 ...

  5. MFC鼠标绘制直线段并使用编码裁剪算法

    聪明的你通过本文可以学会在MFC中 初始化时绘制自定义矩形框 使用鼠标来实时绘制你想要的直线段 实现编码裁剪算法裁去直线段在自定义矩形框以外的部分 完成效果如下 进入运行界面 鼠标绘制直线 编码算法裁 ...

  6. 计算机图形学实验二 《绘制任意斜率的直线》

    计算机图形学实验二 <绘制任意斜率的直线> 视频讲解地址 一.Bresenham算法 用视频讲会好点我之前也录过相关视频可以先凑合看 二.设计CLine类 之前也说了C++一个类是由源文件 ...

  7. matlab的一些考点3matlab绘图——二维曲线绘图(绘制曲线)

    二维数据曲线图 3.1.1 绘制单根二维曲线 plot函数 fplot函数 line函数 3.1.2 绘制多根二维曲线 1.plot函数的输入参数是矩阵形式 2.含多个输入参数的plot函数 3.通过 ...

  8. 海龟绘图两小时上手C语言 - 1 绘制直线

    海龟绘图两小时上手C语言 - 1 绘制直线 整个教程的介绍和目录在这里: 童晶:海龟绘图两小时上手C语言 - 0 引言 1.1 什么是C语言? 如今,我们的生活已经离不开程序.比如用计算机写文章.做P ...

  9. MFC有理二次Bezier曲线绘制

    MFC有理二次Bezier曲线绘制 非有理Bezier曲线曲线无法精确表示所有的二次曲线和二次曲面,引入了有理Bezier曲线曲面,来精确表示.如图,通过控制权重,可以获取不同的二次有理Bezier曲 ...

最新文章

  1. matlab模型参数不匹配怎么办,修改Simulink模型后出现初始状态大小不匹配的错误...
  2. SQL查询分析器使用
  3. SQL Server 文件路径
  4. 淺談Raid Cache Memory上應用的問題和實踐
  5. Java常见的乱码解决方式
  6. php云和骑士哪家好,PHP云人才系统与骑士cms人才系统对比点评
  7. html按钮不可选中,如何使HTML文本不可选择
  8. 图像填充不怕区域大!MSRA等提出协同调制生成对抗网络
  9. Java构造字符串算法题_LeetCode算法题-Repeated Substring Pattern(Java实现)
  10. mqtt安装使用教程。(基于rabbitmq插件,docker部署,k8s部署,python教程)
  11. 花式Finetune方法大汇总
  12. Python下json中文乱码解决办法
  13. CAS(Compare and Swap)理解
  14. 基于嵌入式linux的流媒体传输系统
  15. Android Socket通信
  16. 小米MIUI线刷包cust.img、system.img精简教程(二)
  17. Quirks模式与标准模式
  18. dsf5.0没登录显示登录弹框
  19. 《培根随笔》读书笔记(二)
  20. Pandas工具包实战(16)apply函数操作:numpy, pandas,

热门文章

  1. 车载网络技术——CAN总线基础
  2. 学习笔记(01):【中国PHP教育大牛高洛峰】亲授php教程-PHP布尔类型(boolean)...
  3. 接口测试二(App抓包)
  4. 中兴机试 通信算法方向 秋招春招
  5. 括号配对检测python123_括的意思
  6. 优维低代码:Pipes 管道
  7. 游戏服务器的那些事儿
  8. 我的天空计算机音乐,我的天空(Acoustic Version)
  9. 机器视觉照明技术与装置实验研究(论文纪要)
  10. 徐磊语法 6 7 时态的正确定义