本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6216464.html

MFC画线功能要点有二:其一,鼠标按下时记录初始位置为线的起始端点,其二,利用不同的方法实现画线。下面着重学习总结画线功能实现方法。

  在OnLButtonDown函数中记录起始端点,CPoint m_ptOrigin = point;

  在OnLButtonUp函数中实现画线。方法如下:

  画线方法一:利用SDK全局函数实现视图窗口画线功能

//获取设备描述表
HDC hdc;
//调用全局函数获得当前窗口的设备描述表,CWnd::m_hWnd根据继承原理,CDrawView继承了CWnd类的数据成员
hdc = ::GetDC(m_hWnd);
//移动到线条的起点
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);//第四个参数用于保存鼠标移动前的位置,此处不需要,设为NULL
//画线
LineTo(hdc,point.x,point.y);
//释放设备描述表
::ReleaseDC(m_hWnd,hdc);

画线方法二:利用MFC的CDC类实现画线功能

//说明:CDC类封装了所有与绘图相关的操作
CDC* pDC = GetDC();//定义CDC类型的指针,利用CWnd类的成员函数GetDC获得当前窗口的设备描述表对象的指针
pDC -> MoveTo(m_ptOrigin);//利用CDC类的成员函数MoveTo和LineTo完成画线功能
pDC -> LineTo(point);
ReleaseDC(pDC);

  画线方法三:利用CClientDC类

//说明:此类派生于CDC类,在构造时调用GetDC()函数,在析构时调用ReleaseDC()函数,因此无需显示调用这两个函数。
//CClientDC dc(this);//在当前视图窗口画线方法
CClientDC dc(GetParent());//获取当前视图窗口的父窗口,可以在父窗口画线
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

画线方法四:利用CWindowDC类
//CWindowDC dc(this);//只能在视类中画线
CWindowDC dc(GetParent());//可以在父窗口中画线
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);

如果我们要更多功能的绘制方法,可以利用更多的资源和方法,如:

更多方法之:绘制彩色线条(设备描述表中默认有一个黑色画笔)

CPen pen(PS_SOLID,5,RGB(255,255,0));//创建画笔对象
CClientDC dc(this);
CPen* pOldPen = dc.SelectObject(&pen);
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);
dc.SelectObject(pOldPen);

更多方法之:绘制连续线条

//* 此时需要添加鼠标移动消息响应函数OnMouseMove,当鼠标移动时记录位置并绘制短线,然后需要将此时鼠标位置设置为下一次绘制的起点坐标,     

//* 这样便可以绘制连续线条了。为此,添加一个判断是否在画线的布尔变量m_bTrue,在视类构造函数中初始化为true,在OnLButtonDown中初始化为true,  

//* 在OnLButtonUp中初始化为false,OnMouseMove函数如下:                                                 

// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
//创建一个红色的、宽度为1的实线画笔
CPen pen(PS_SOLID,1,RGB(255,0,0));
//把创建的画笔选入设备描述表
CPen *pOldPen = dc.SelectObject(&pen);
if(m_bTrue == true)
{
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);

  m_ptOrigin = point;//如果不修改起点 坐标,画线效果是扇形
}
//恢复设备描述表
dc.SelectObject(pOldPen);

这样就可以绘制连续线条了。

更多方法之:使用画刷绘图
//创建一个红色画刷
CBrush brush(RGB(255,0,0));
//创建并获得设备描述表
CClientDC dc(this);
//用红色画刷填充鼠标拖动过程形成的矩形区域
dc.FillRect(CRect(m_ptOrigin,point),&brush);

更多方法之:位图画刷

//注:需要先添加一个位图资源,ID为IDB_BITMAP1

//创建位图对象
CBitmap bitmap;
//加载位图资源
bitmap.LoadBitmapW(IDB_BITMAP1);
//创建位图画刷
CBrush brush(&bitmap);
//创建并获得设备描述表
CClientDC dc(this);
//用位图画刷填充鼠标拖动过程形成的矩形区域
dc.FillRect(CRect(m_ptOrigin,point),&brush);

先介绍这么多吧,这些都是我的学习总结,

如果有疑问,可以联系giserdev@163.com,更多内容请参考:http://www.cnblogs.com/mxbs/,技术交流请加QQ群:586571286。

MFC画线功能总结的更多相关文章

  1. MFC消息映射机制以及画线功能实现

    ---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...

  2. .NET CAD二次开发学习 对称画线功能

    [CommandMethod("CBline")] //对称画线 public void CBline() { Document doc = Application.Documen ...

  3. iOS-实现最简单的画线功能 . 转

    前提:CoreGraphics.framework - (void)viewDidLoad { [super viewDidLoad]; UIImageView *imageView=[[UIImag ...

  4. 【MFC】画线

    1.DrawTestDlg.h afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT ...

  5. 使用python pylab库 画线

    pylab 提供了比较强大的画图功能,但是函数和参数都比较多,很容易搞混.我们平常使用最多的应该是画线了.下面,简单的对一些常用的划线函数进行了封装,方便使用. # -*- coding: utf-8 ...

  6. GDI+学习之------ 画线、区域填充、写字

    <精通GDI编程>里的代码.在学习过程中对它加以总结,以防以后用到,全部代码都是在MFC 单文档中实现的,写在View::OnDraw(CDC */*pDC*/)中 画线/边框(Pen) ...

  7. CGContextRef 画线简单用法

    CGContextRef CGContextMoveToPoint(context,150,50);//圆弧的起始点 CGContextAddArcToPoint(context,100,80,130 ...

  8. Android中Path类的lineTo方法和quadTo方法画线的区别

    转载:http://blog.csdn.net/stevenhu_223/article/details/9229337 当我们需要在屏幕上形成画线时,Path类的应用是必不可少的,而Path类的li ...

  9. altium designer不经过原理图直接在空白pcb上加封装然后画线

    如果是复杂点的PCB,建议还是画下SCH,如果PCB只有几个元件,那么可以用这种方法,想不画原理图,直接进行布线,往往是很多初学者最想知道的,但是这也一定不是初学者能学到的.因为你买的书,都是按画PC ...

随机推荐

  1. SQL Server-简单查询示例(十一)

    前言 本节我们讲讲一些简单查询语句示例以及需要注意的地方,简短的内容,深入的理解,Always to review the basics. EOMONTH 在SQL Server 2012的教程示例中 ...

  2. Android开发之自定义组件和接口回调

    说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的.在这篇博客开始的时候呢,我想聊一下iOS的自定义控件.在iOS中自定义控件的思路是继承自UIView, 在UIVie ...

  3. (转)ubuntu apache2 的负载均衡和反向代理

    apache功能其实很是强大,最近一段时间研究了下apache的反向代理和负载均衡,反向代理网协的外网出口和我的博客出口就是通过apache的反向代理实现的,总结一下,重点说说负载均衡的配置. 首先说 ...

  4. ASP.NET Core 中文文档 第二章 指南(4.5)使用 SQL Server LocalDB

    原文:Working with SQL Server LocalDB 作者:Rick Anderson 翻译: 魏美娟(初见) 校对: 孟帅洋(书缘).张硕(Apple).许登洋(Seay) Appl ...

  5. LinqToDB 源码分析——生成表达式树

    当我们知道了Linq查询要用到的数据库信息之后.接下就是生成对应的表达式树.在前面的章节里面笔者就已经介绍过.生成表达式树是事实离不开IQueryable<T>接口.而处理表达式树离不开I ...

  6. .NET 实现并行的几种方式(二)

    本随笔续接:.NET 实现并行的几种方式(一) 四.Task 3)Task.NET 4.5 中的简易方式 在上篇随笔中,两个Demo使用的是 .NET 4.0 中的方式,代码写起来略显麻烦,这不 .N ...

  7. ionic2+angular2中踩的那些坑

    好久没写什么东西了,最近在做一个ionic2的小东西,遇到了不少问题,也记录一下,避免后来的同学走弯路. 之前写过一篇使用VS2015开发ionic1的文章,但自己还没摸清门道,本来也是感兴趣就学习了 ...

  8. Unity 3D json嵌套使用以及多种类型匹配

    我们控制端要发送很多命令给终端设备,其中有速度,方向,开关门,开关灯....方法千万种,我只取一瓢.我还小,不知道其他人是怎么写的.我喜欢把有规律的东西放在一起写!为了我的强迫症! using Uni ...

  9. react-native学习笔记--史上最详细Windows版本搭建安装React Native环境配置

    参考:http://www.lcode.org/react-native/ React native中文网:http://reactnative.cn/docs/0.23/android-setup. ...

  10. java重载与覆写

    很多同学对于overload和override傻傻分不清楚,建议不要死记硬背概念性的知识,要理解着去记忆. 先给出我的定义: overload(重载):在同一类或者有着继承关系的类中,一组名称相同,参 ...