作业要求:

按下鼠标右键画圆。

按下鼠标左键移动曲线。

丝毫没有思路。。网上教程又比这个程序复杂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 ,我果然还是有点小天赋~

【MFC学习笔记-作业7-小型画图软件】【】的更多相关文章

  1. 【MFC学习笔记-作业10-稍微难一点的画图】

    设计如图所示的菜单,并编写相应用的消息处理函数.. 菜单1: 画图 画线 画矩形 画图 菜单2:颜色 红色(r) CTRL+F2; 绿色(g) CTRL +F1 蓝色(b) CTRL+F3: 问题:V ...

  2. 【MFC学习笔记-作业8-蝴蝶飞~】【什么鬼作业】

    作业要求: 用定时器控制蝴蝶在窗口废物,如图所示... 这是什么鬼作业啊...蝴蝶还要我这个手残手画啊233333333          (ノಠ .ಠ)ノ彡┻━┻ 不过多亏之前几个鬼作业的福 收获颇 ...

  3. 【MFC学习笔记-作业9-基于单击响应的计算平均成绩】【】

    要求..单击出现 一个输入成绩的框,点确定后,计算平均成绩 意义很大~ 完成对话框   再写个鼠标点击的响应部分 鼠标点击的响应部分为难点.... void CWj1401_0302140107_9V ...

  4. 【MFC学习笔记-作业6-sin图像】【OnDraw(CDC* pDC)】

    根据这段源代码 一步一步剖析CDC的使用 void CDrawSinXView::OnDraw(CDC* pDC) { CDrawSinXDoc* pDoc = GetDocument(); ASSE ...

  5. 【MFC学习笔记-作业5-小数据库】【单选框,复选框,滚动条,列表框】

    界面已经实现完毕. 要完成的操作就是1.性别分组(2选1) 2.属性勾选 3.年龄通过滚动条调整 4.职称通过下方的列表框选择 5.输入姓名 6.存入左方的列表框 7.当选择左方列表框的人时,可以显示 ...

  6. MFC 学习笔记

    MFC 学习笔记 一.MFC编程基础: 概述: 常用头文件: MFC控制台程序: MFC库程序: 规则库可以被各种程序所调用,扩展库只能被MFC程序调用. MFC窗口程序: 示例: MFC库中类的简介 ...

  7. MFC学习笔记1---准备工作

    什么是MFC MFC,全称Microsoft Foundation Classes,微软基础类库,顾名思义,是微软的攻城狮们将一些常用的基础的Windows API 函数用C++的形式封装成类,简化程 ...

  8. Android学习笔记进阶18 之画图并保存图片到本地

    1.首先创建一个Bitmap图片,并指定大小:   2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可:   3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...

  9. Android学习笔记进阶18之画图并保存图片到本地

    1.首先创建一个Bitmap图片,并指定大小:   2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可:   3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...

随机推荐

  1. 徐汉彬:亿级Web系统搭建—单机到分布式集群

    当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构层 ...

  2. php 中利用json_encode和json_decode传递包括特殊字符的数据

    </pre><span style="font-size:24px"></span><pre name="code" ...

  3. android假设重写onDraw实现一个相似TextView能够显示表情和链接的控件(一)

    先看效果图: 写一个超连接支持的对象: /**作为超连接显示的对象*/ public class LinkInfo implements Comparable<LinkInfo>{ pri ...

  4. videojs 视频开发API

    videojs就提供了这样一套解决方案,他是一个兼容html5的视频播放工具,早期版本兼容所有浏览器,方法是:提供三个后缀名的视频,并在不支持html5的浏览器下生成一个flash的版本. 最新的3. ...

  5. js数字验证

    1.JS判断只能是数字和小数点 1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g, ...

  6. <转>java中静态方法和非静态方法的存储

    Java中非静态方法是否共用同一块内存? 将某 class 产生出一个 instance 之后,此 class 所有的 instance field 都会新增一份,那么所有的 instance met ...

  7. 关于ajax提交的公共接口的一大用处

    在项目框架搭建的时候,就写了ajax提交的公共接口,是想统一的日志和处理ajax返回的错误信息. 今天,却又帮我解决了另外一个问题:每次点开某个页面,有一个ajax请求总是会调用两次,于是打开chro ...

  8. 【Android 错误记录】Conversion to Dalvik format failed with error 1 错误

    错误原因:依赖的包中有冲突,比如依赖了同一个jar包的不同版本等   在以往测试的过程中,出现过几次这个问题,根本原因都是因为有冲突了,但是表现形式可能不一样   情况1: 有一个叫DemoAPP的工 ...

  9. oracle中的rowid和数据行的结构

    在oracle数据库系统中每一行都有一个rowid,oracle数据库系统就是利用rowid来定位数据行的.rowid也是oracle中内置的一个标量数据类型 rowid有一下特点; 是数据库中每一行 ...

  10. 菜单之二:使用xml文件定义菜单

    参考<疯狂android讲义>2.10节 P174,参见归档project:XmlMenuDemo.zip 一般推荐使用XML文件定义菜单. 基本步骤如下: 1.定义布局文件 为简单显示原 ...