MFC画线功能总结
本文仅用于学习交流,商业用途请支持正版!转载请注明: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画线功能总结的更多相关文章
- MFC消息映射机制以及画线功能实现
---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...
- .NET CAD二次开发学习 对称画线功能
[CommandMethod("CBline")] //对称画线 public void CBline() { Document doc = Application.Documen ...
- iOS-实现最简单的画线功能 . 转
前提:CoreGraphics.framework - (void)viewDidLoad { [super viewDidLoad]; UIImageView *imageView=[[UIImag ...
- 【MFC】画线
1.DrawTestDlg.h afx_msg void OnLButtonDown(UINT nFlags, CPoint point); afx_msg void OnLButtonUp(UINT ...
- 使用python pylab库 画线
pylab 提供了比较强大的画图功能,但是函数和参数都比较多,很容易搞混.我们平常使用最多的应该是画线了.下面,简单的对一些常用的划线函数进行了封装,方便使用. # -*- coding: utf-8 ...
- GDI+学习之------ 画线、区域填充、写字
<精通GDI编程>里的代码.在学习过程中对它加以总结,以防以后用到,全部代码都是在MFC 单文档中实现的,写在View::OnDraw(CDC */*pDC*/)中 画线/边框(Pen) ...
- CGContextRef 画线简单用法
CGContextRef CGContextMoveToPoint(context,150,50);//圆弧的起始点 CGContextAddArcToPoint(context,100,80,130 ...
- Android中Path类的lineTo方法和quadTo方法画线的区别
转载:http://blog.csdn.net/stevenhu_223/article/details/9229337 当我们需要在屏幕上形成画线时,Path类的应用是必不可少的,而Path类的li ...
- altium designer不经过原理图直接在空白pcb上加封装然后画线
如果是复杂点的PCB,建议还是画下SCH,如果PCB只有几个元件,那么可以用这种方法,想不画原理图,直接进行布线,往往是很多初学者最想知道的,但是这也一定不是初学者能学到的.因为你买的书,都是按画PC ...
随机推荐
- 劈荆斩棘:Gitlab 部署 CI 持续集成
阅读目录: install configue gitlab-ci-multi-runner restore nuget packages bulid .sln run unit tests confi ...
- 《高性能javascript》 领悟随笔之-------DOM编程篇
<高性能javascript> 领悟随笔之-------DOM编程篇一 序:在javaSctipt中,ECMASCRIPT规定了它的语法,BOM实现了页面与浏览器的交互,而DOM则承载着整 ...
- 智能指针unique_ptr的用法
unique_ptr是独占型的智能指针,它不允许其他的智能指针共享其内部的指针,不允许通过赋值将一个unique_ptr赋值给另一个unique_ptr,如下面错误用法: std::unique_pt ...
- Java程序日志:java.util.logging.Logger类
一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...
- Effective java笔记(一),创建与销毁对象
1.考虑用静态工厂方法代替构造器 类的一个实例,通常使用类的公有的构造方法获取.也可以为类提供一个公有的静态工厂方法(不是设计模式中的工厂模式)来返回类的一个实例.例如: //将boolean类型转换 ...
- 《连载 | 物联网框架ServerSuperIO教程》- 5.轮询通讯模式开发及注意事项。附:网友制作的类库说明(CHM)
1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...
- spring+mybatis多数据源动态切换
spring mvc+mybatis+多数据源切换 选取oracle,mysql作为例子切换数据源.oracle为默认数据源,在测试的action中,进行mysql和oracle的动态切换. web. ...
- Reactjs-JQuery-Vuejs-Extjs-Angularjs对比
写在前面 前端越来越混乱了,当然也可以美其名曰:繁荣. 当新启动一个前端项目,第一件事就是纠结:使用什么框架,重造什么轮子? 那么,希望看完此篇,能够给你一个清晰的认识,或者让你更加地纠结和无所适从 ...
- 使用PowerShell修改操作系统“环境变量”
有时候我们需要命令行工具,但在使用前往往需要先导航至命令工具所在的目录,比如:stsadm 我们首先需要导航至(以SharePoint2013为例):C:\Program Files\Common ...
- Android将应用调试log信息保存在SD卡
转载:http://blog.csdn.net/way_ping_li/article/details/8487866 把自己应用的调试信息写入到SD卡中. package com.sdmc.hote ...