作业要求:

按下鼠标右键画圆。

按下鼠标左键移动曲线。

丝毫没有思路。。网上教程又比这个程序复杂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. Unity 为自己组件添加公共方法

    为什么需要跟你的组件添加公共方法呢? 留一条后路嘛,万一你那天想起要给全部的组件添加一个方法. 此时我只能告诉你慢慢修改吧累死你 子组件:A ,父组件:B继承方式:  A -> B –> ...

  2. Struts2(二)——配置文件struts2.xml的编写

    接上一篇博客,这篇博客讲述一下2——9小标题的内容,这些问题都可以在struts2配置文件中设置(当然有的也可以在Struts.properties属性文件,web.xml中进行设置),而且常规开发中 ...

  3. UP UP UP!(dp)

    UP UP UP! Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 92  Solved: 27SubmitStatusWeb Board Descri ...

  4. 用JSmooth制作java jar文件的可运行exe文件教程【图文】

    这是我之前在个人博客3yj上面写的一篇文章,如今转载过来,原文地址 (这不是广告哦) 几年前,刚接触java的是,就想用一些方法把自己的劳动果实保护起来,曾经也用过非常多这种工具,有一个特别好用,今天 ...

  5. java学习笔记day02

    1.如何定义一个功能,并通过函数(方法)体现出来呢?  1)明确改功能运算后的结果.确定函数的返回值类型.  2)明确在实现该功能的过程中是否有未知内容参与运算.确定参数列表. 2.函数重载:在同一个 ...

  6. Java - 泛型 ( Generic )

    Java - 泛型 ( Generic )     > 泛型的特点         > 解决元素存储的安全性问题         > 解决获取数据元素时,需要类型强转的问题     ...

  7. js打印数据类型

    console.log({}.toString.call(123))--- [object Number].... [object String] [object Undefined] [object ...

  8. core-site.xml配置项:hadoop.tmp.dir

    hadoop.tmp.dir:A base for other temporary directories. 集群运行后,修改该配置项后,发现类似错误: -- ::, INFO org.apache. ...

  9. HDU 1055 - Color a Tree

    一棵树,结点树为n,根结点为r.每个结点都有一个权值ci,开始时间为0,每染色一个结点需要耗时1,每个结点的染色代价为ci*ti(ti为当前的时间),每个结点只有在父结点已经被染色的条件下才能被染色. ...

  10. 解决在IE浏览器下 boder边框出现断裂或虚线的问题

    ie6.0下面经常会出现border边框断断续续的问题,等深一步了解了div之后自然会经常碰到这种问题了,不过初学div+css 的一般不会用遇到这个问题,因为初学者不会偷懒,等我们觉得用的很熟了,各 ...