第3章 MFC绘图基础
VC中MFC绘图详细教程

前一页
休息
字体对象 CFont NewFont; (2)创建字体
CreateFont( int nheight,int nWidth,//高,宽 int nEscapement, //每行文字相以于页底的角 int nOrienation, //每个….. DWORD nWeight , //字体粗细 DWORD dwltalic, //非零表示倾斜 DWORD dwUnderline, //非零表示下划线 DWORD dwStrikeout, //非零表示中划线 DWORD dwCharset, //字符集 DWORD dwOutputPrecision, //输出精度 DWORD dwClipPrecision, //剪裁精度 DWORD dwQuality, //输出质量 DWORD dwPitchAndFamily, //字体系列 lpszFaceName//字体名称} ; 前一页 DWORD 休息
4
休息
设备环境
设 备 环 境
获取设备环境 (1)使用GetDC()函数 CDC *CWnd GetDC() int ReleaseDC(CDC * pDC ) (2)直接构造CDC对象 用声明一个CDC类或其派生类对象的方式来 获取设备环境 CClientDC dc(CWnd *)
前一页
休息
3
设备环境
设 备 环 境
前一页
(1)CWindowDC 和CClientDC CPaintDC区别 CWindowDC提供客户区和非客户区画图的设备环 境;坐标原点在屏幕左上角 CClientDC CPaintDC提供画图的设备环境;坐标原 点在客户区左上角 (2) CClientDC 和CPaintDC区别 CPaintDC是响应WM_PAINT消息,用在OnPaint() 函数中;只支持屏幕显示 CClientDC不响应WM_PAINT消息,只担负此时的 绘图工作;支持屏幕显示,也支持打印 CDC常用函数(参见MSDN)
MFC绘图

一、绘制线条1、新建MFC单文档工程Draw。
2、为CDrawView类添加CPoint类型的成员变量m_ptOrigin,将其访问权限设置为Private。
3、添加WM_LBUTTONDOWN的消息响应函数,该函数初始化m_ptOrigin变量m_ptOrigin=point。
4、添加WM_LBUTTONUP的消息响应函数void CDrawView::OnLButtonUp(UINT nFlags, CPoint point),在该函数里可添加如下各种代码实现绘图:(1)、利用SDK全局函数实现画线功能:HDC hdc;hdc=::GetDC(m_hWnd); //获得窗口的设备描述表MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL); //移动到线条的起点LineTo(hdc,point.x,point.y); //画线::ReleaseDC(m_hWnd,hdc);//释放设备描述表知识点:所有派生于CWnd类的子类都拥有m_hWnd这一成员变量,m_hWnd被定义为HWND类型,用于保存当前窗口的句柄,该成员变量具有public的访问权限。
(2)、利用MFC的CDC类实现画线功能:CDC* pDC=GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);知识点:MFC提供了设备描述表的封装类CDC,该类封装了所有与绘图相关的操作。
该类提供了一个数据成员m_hDC,用来保存与CDC类相关的DC句柄(3)、利用MFC的CClientDC类实现画线功能:CClientDC dc(this);//dc(GetParent())可获得父窗口的DCdc.MoveTo(m_ptOrigin);dc.LineTo(point);知识点:CClientDC派生于CDC类,当一个CClientDC对象在构造时,它在内部会调用GetDC 函数,在这个CClientDC对象析构时,它会调用ReleaseDC函数。
MFC交互绘图基础

第二章MFC交互绘图基础在上一章我们所创建的应用程序中,通过添加的菜单项实现了简单的用户和应用程序的交互。
用户可以通过选择菜单项,定义使用的画笔和画刷,并通过选择菜单项执行相应的绘图代码来看绘制的图形。
但是该应用程序有很多缺点,比如绘制的图形有限,想要绘制新的图形必须修改代码;通过菜单处理函数执行的绘图代码因为没有将图形的信息存储起来,导致图形在窗口进行视图重画时不能够正确显示等等。
通常情况下,用户需要使用更灵活的方式来绘制图形。
比如像Windows中的“画图”程序一样,用户使用鼠标绘制图形,可以更灵活方便的设置绘图使用的画笔和画刷的类型,并且希望绘制完的图形可以保存起来,以后可以再次打开以前所绘制的图形并进行编辑。
本章将以编写一个简单的绘图应用程序为例,介绍如何在MFC中实现鼠标绘图,如何定义图元的结构以保证应用程序可以正确的重画用户绘制的图形,如何选择和编辑已有的图形,如何保存图形到永久存储介质中等等的编程方法。
这个简单的绘图应用程序将实现以下基本功能:用户使用鼠标绘制图形;通过对话框设置绘制图形使用的线型和颜色以及填充封闭区域的模式和颜色;用户可以选择已经绘制的图形,并可以对该图形进行编辑;可以保存绘制完的图形到永久存储介质(这里是硬盘)中,以便以后可以读取以前绘制的图形,并再次进行编辑。
2.1创建工具条创建一个新的MFC项目,项目名称为DrawMap。
创建该项目时各步的设置与上一章中创建DrawTest项目时相同,只是在“MFC AppWizard – Step 4 of 6”对话框中不选择Printing and print preview复选框。
在上一章的应用程序中,用户需要通过选择菜单项来选择要执行的功能。
当菜单项的层数比较多的时候,用户需要点击的次数较多。
对于一些常用的功能,用户会希望能够更容易的选择到,此时就可以使用工具条。
对于本章中要创建的绘图应用程序来说,绘图功能是常用功能,所以可以将这些功能的选择做成工具条。
MFC基本的图形绘制 CDC类

MFC图形绘制1 、Windows应用程序概述1、设备环境类CDC设备环境是由Windows保存的一个数据结构,该结构包含应用程序向设备输出时所需要的信息,例如:图形是在屏幕上显示还是通过打印机输出。
为了能让用户使用一些特殊的设备环境,基类CDC还派生了以下各类:(1)CPaintDC类,此类比较特殊,它的构造函数和析构函数都是针对OnPaint进行的。
用户一旦获得相关的CDC指针,就可以将它当做任何设备环境(包括屏幕、打印机)指针来使用,CPaintDC类的构造函数会自动调用BeginPaint,而它的析构函数则会自动调用EndPaint。
(2)CClientDCCClientDC只能在窗口的客户区(不包括边框、标题栏、选单栏以及状态栏)进行绘图,点(0,0)通常指的是客户区的左上角。
其构造函数调用GetDC,析构函数调用ReleaseDC 函数用法是:CClientDC dc(this);;//this一般指向本窗口或当前活动视图dc.TextOut(10,10,str,str.GetLength());(3)CWindowDC•允许在窗口的任意位置中进行绘图,点(0,0)指整个窗口的左上角。
其构造函数调用GetWindowDC,析构函数调用ReleaseDC函数。
•Windows为设备环境提供了各种各样的绘图工具,例如:画笔、画刷、字体等。
MFC封装了这些工具,并提供相应的类来作为应用程序的图形设备接口(GDI,Graphics Device Interface),这些类有一个共同的抽象基类CGdiObject,如下所示:类名说明:•CBitmap“位图”是一种位矩阵,每一个显示像素都对应于其中的一个或多个位,用户可以利用位图来表示图象,也可以利用它来创建画刷。
•CBrush“画刷”定义了一种位图形式的像素,利用它可对区域内部填充颜色或样式。
•CFont“字体”是一种具有某种风格和尺寸的所有字符的完整集合,它常常被当做资源存于磁盘中,其中有一些还依赖于某种设备。
MFC绘图教程

常用颜色对照表
例:COLLORREF red = RGB(255,0,0);
3/21/2011
13
中获取DC 在MFC中获取 中获取
在如OnDraw等函数中传递一个指向 等函数中传递一个指向CDC 对象的 在如 等函数中传递一个指向 指针
3/21/2011
9
设备环境类的基本功能
3/21/2011
10
CDC类常用绘图函数 类常用绘图函数
Arc:绘制一段弧 : Chord:绘制弦形 : Ellipse:绘制椭圆或圆 : MoveTo:将当前位置移动到指定位置 : LineTo:从当前位置到指定位置画一条直线 : Polyline:画连接指定点的折线段 : PolyBezler:根据两个端点和两个控制点画贝塞尔曲线 : Pie:画冰块 : Polygon:根据两个或两个以上的顶点绘制一个多边形 : Rectangle:根据指定的左上角和右下角坐标绘制一个矩形 : RoundRect:画圆角矩形 : SetPixel:画一个点 :
void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); ; OnDraw(&dc); //调用了 调用了OnDraw 调用了 }
可见OnPaint函数也调用了 可见 函数也调用了CView::OnDraw函数。因而一 函数。 函数也调用了 函数 般在OnDraw函数内添加绘图代码,完成绘图任务 函数内添加绘图代码, 般在 函数内添加绘图代码
3/21/2011
16
OnDraw与OnPaint的区别 与 的区别
OnDraw是CView类的成员函数,不响应消息;OnPaint是 是 类的成员函数, 类的成员函数 不响应消息; 是 CWnd类的成员函数,相应 类的成员函数, 消息。 类的成员函数 相应WM_PAINT消息。 消息 CView默认调用的 默认调用的OnPaint函数如下 默认调用的 函数如下
MFC基本绘图函数使用方法

一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 绘制图形如下所示,坐标(100, 150)表示距离左边100,距离顶部 150。
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数 注意:绘制图形主要调用CDC* pDC方法实现,MFC可以补充 提示函数。
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
(1)绘制直线
计算机图形学
一.MFC基本绘图函数使用方法
三. MFC绘图函数及扩展
1.MFC绘图函数
void CTest01View::OnDraw(CDC* pDC) {
CTest01Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDC->MoveTo(100,150); pDC->LineTo(300,400); // TODO: add draw code for native data here }
MFC绘图工具类包括CGdiObject、CBitmap、CBrush、 CFont、CPallette、CPen和CRgn等。常用的包括:
(4) CPen:封装了GDI画笔,选作设备上下文的当前画笔, 画笔用于绘制图形边界线;
(5) CPallette:封装了GDI调色板,提供应用程序和显示器 之间的颜色接口;
计算机图形学
一.MFC基本绘图函数使用方法
一. MFC绘图基础知识 CDC类
CDC类派生出CClientDC类、CMetaFileDC类、 CPaintDC类和CWindowDC类。
MFC图形绘制编程教程PPT优秀课件

16
3.1设备环境
2021/6/3
Step Into-如果当前正在 执行的语句中有函数,那 么会进入函数体单步执行 函数体的每一条语句。 Step Over-如果当前正 在执行的语句中有函数, 会执行调用函数,不单步 执行函数体。 Step Out-如果当前正单 步执行函数体,会直接跳 出函数执行,返回上层代 码。
2021/6/3
25
定义弧的椭圆母体 所对应的矩形区域
3.2 绘图函数
定义切割椭圆 母体的两个点
2021/6/3
26
3.2 绘图函数
高光部分的颜色
阴影部分的颜色
定义扇形、弓形的椭圆母 体所对应的矩形区域
2021/6/3
定义切割椭圆 母体的两个点
注意:逆时针原则 27
设备环境就属于上述的对象之一,它是Windows 的对象,MFC用CDC类封装了设备环境对象。
2021/6/3
2
3.1设备环境
Windows API给出了4种类型的设备环境
• 显示设备环境:支持视频显示器上的图形操作; • 信息设备环境:提供设备数据的检索; • 内存设备环境:支持位图上的图形操作; • 打印设备环境:支持打印机或绘图仪上的图形操作。
Windows程序设计
第三章 图形编程
2021/6/3
1
3.1设备环境
首先要明白一个常识,Windows是早于C++的,并 独立于C++之外,因此,Windows的某些对象(注 意这个说法“Windows的对象”)并不都属于 C++封装技术的规范之内,即Windows的这些对 象是Windows作为一个OS本身的对象,不是由某 个C++的类创建而来,但是在C++里却可以用一 个类封装这个(或这些)对象,并创建它们。
mfc画图课程设计

mfc 画图课程设计一、教学目标本课程旨在通过MFC画图的学习,让学生掌握以下知识目标:1. 理解MFC的基本概念和原理;2. 掌握MFC的基本绘图方法;3. 了解MFC绘图的应用场景。
技能目标:1. 能够运用MFC进行简单的图形绘制;2. 能够通过MFC实现图形的基本操作;3. 能够运用MFC解决绘图相关问题。
情感态度价值观目标:1. 培养学生对计算机编程的兴趣和热情;2. 培养学生独立思考和解决问题的能力;3. 培养学生团队协作和交流的能力。
二、教学内容本课程的教学内容主要包括以下几个部分:1. MFC的基本概念和原理;2. MFC 的基本绘图方法;3. MFC绘图的应用场景。
详细的教学大纲如下:第1周:MFC的基本概念和原理1.1 MFC的定义和发展历程1.2 MFC的基本组成和架构1.3 MFC的优点和缺点第2周:MFC的基本绘图方法2.1 MFC绘图环境的基本操作2.2 MFC绘图工具的使用2.3 MFC绘图方法的具体实现第3周:MFC绘图的应用场景3.1 MFC绘图在实际项目中的应用3.2 MFC绘图在解决实际问题中的优势3.3 MFC绘图在其他领域的拓展三、教学方法为了提高教学效果,本课程将采用以下教学方法:1.讲授法:通过讲解MFC的基本概念、原理和绘图方法,让学生掌握相关知识。
2.案例分析法:通过分析实际项目中的应用案例,让学生了解MFC绘图在实际场景中的应用。
3.实验法:让学生动手实践,亲自编写代码,绘制图形,提高学生的实际操作能力。
四、教学资源为了支持本课程的教学,我们将准备以下教学资源:1.教材:《MFC画图教程》2.参考书:《MFC编程入门》、《MFC实例解析》3.多媒体资料:教学PPT、视频教程4.实验设备:计算机、编程环境(如Visual Studio)五、教学评估本课程的评估方式将包括以下几个方面:1.平时表现:包括课堂参与度、提问回答、小组讨论等,占总评的30%。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Case
一般处理 WM_PAINT的形式如下: WM_PAINT;
hdc = BeginPaint(hwnd, &ps) ; …… EndPaint(hwnd, &ps) ; return 0 ;
10
计算机科学与技术学 院 张淼
如果采用MFC方法编程,MFC提供了不同类型的
DC类,每一个类都封装了DC句柄,并且它们的构 造函数自动调用获取DC的API函数,析构函数自 动调用释放DC的API函数。因此,在程序中通过 声明一个MFC设备环境类的对象就自动获取了一 个DC,而当该对象被销毁时就自动释放了获取的 DC。MFC AppWizard应用程序向导创建的 OnDraw()函数自动支持所获取的DC。
MFC提供了两个函数CDC::DPtoLP()和CDC:: LPtoDP()用于设备坐标与逻辑坐标之间的相互 转换。
绘制基本图形
生成设备环境,就可以开始绘制不同形状的几何 图形,GDI提供了绘制基本图形的成员函数,这 些函数封装在 MFC 的 CDC 类中。 CDC 类提供的 绘图函数包括点、直线、曲线、矩形、椭圆、弧 、扇形、弦形和多边形等供用户使用。如果进行 复杂绘图的话,就需要通过算法来组织这些基本 绘图函数来完成绘图。 绘图函数使用的坐标都是逻辑坐标。
画线
LineTo函数用于绘制一条从当前绘图位置到 指定坐标点的直线段,其函数声明如下: BOOL LineTo(int x, int y); BOOL LineTo(POINT point); 参数x和y,及参数point指定了坐标点,默认 情况下从(0,0)开始画
利用MFC AppWizard建立一个SDI应用程序,在 OnDraw()函数中添加如下程序代码: pDC->LineTo(10,10); POINT p1;p1.x = 100;p1.y = 100;//使用 POINT结构 pDC->LineTo(p1); CPoint p2;p2.x = 200;p2.y = 100;//使用 CPoint类 pDC->LineTo(p2);
函 数
SetPixel
功
用指定的颜色在指定的坐标画一个点
能
MoveTo
LineTo Polyline PolyBezier
移动当前位置到指定的坐标,函数返回以前位置的坐标。
从当前位置到指定位置画一条直线 从当前位置开始,根据函数参数绘制多条折线。 根据两个端点和两个控制点绘制贝济埃(Bezier)曲线。
Rectangle函数 用于绘制矩形,其函数声明如下: BOOL Rectangle(int x1, int y1, int x2, int y2); BOOL Rectangle(LPCRECT lpRect); 其中第一个函数参数给出了两组点坐标,第 一组为矩形的左上角点坐标,第二组为矩形 的右下角点坐标。第二个函数使用了指向矩 形区域结构的指针作为参数,也可以使用 CRect类。如果绘图成功,函数返回TRUE ,否则返回FALSE。
设备环境DC(Device Context)
为了实现设备无关性,应用程序的输出不直接面
向显示器等物理设备,而是面向一个称之为设备 环境DC(Device Context)的虚拟逻辑设备。
设备环境也称设备描述表或设备上下文,它是由
Windows管理的一个数据结构,它保存了绘图操 作中一些共同需要设置的信息,如当前的画笔、 画刷、字体和位图等图形对象及其属性,以及颜 色和背景等影响图形输出的绘图模式。
可见OnPaint函数也调用了CView::OnDraw函数。因而一 般在OnDraw函数内添加绘图代码,完成绘图任务
15
GDI坐标系和映射模式
Windows坐标系分为逻辑坐标系和设备坐标系两
种, GDI 支持这两种坐标系。一般而言, GDI 的 文本和图形输出函数使用逻辑坐标,而在客户区 移动或按下鼠标的鼠标位置是采用设备坐标。
OnDraw与OnPaint的区别
OnDraw是CView类的成员函数,不响应消息;OnPaint 是CWnd类的成员函数,相应WM_PAINT消息。 CView默认调用的OnPaint函数如下
void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); //调用了OnDraw }
CPaintDC类是OnPaint()函数使用的设备环境类
,它代表一个窗口的绘图画面。如果添加 WM_PAINT消息处理函数OnPaint(),就需要使 用CPaintDC类来定义一个设备环境对象。
CClientDC类代表了客户区设备环境。当在客户
区实时绘图时,需要利用CClientDC类定义一个 客户区设备环境。
逻辑坐标系是面向 DC的坐标系,这种坐标不考虑
具体的设备类型,在绘图时,Windows会根据当 前设置的映射模式将逻辑坐标转换为设备坐标。
设备坐标系是面向物理设备的坐标系,这种坐标
以像素或设备所能表示的最小长度单位为单位,X 轴方向向右,Y轴方向向下。设备坐标系的原点位 置(0, 0)不限定在设备显示区域的左上角。
设备坐标系统
设备坐标系统
x轴自左至右,y轴从上到下,坐标原点在屏 幕左上角
O [0,0] X
Y
17
设备坐标系分为屏幕坐标系、窗口坐标系和客户区 坐标系三种相互独立的坐标系。
屏幕坐标系以屏幕左上角为原点,一些与整个屏 幕 有 关 的 函 数 均 采 用 屏 幕 坐 标 , 如 GetCursorPos() 、 SetCursorPos()、 CreateWindow()、MoveWindow()。 弹 出 式 菜单使用的也是屏幕坐标。 窗口坐标系以窗口左上角为坐标原点,它包括窗 口标题栏、菜单栏和工具栏等范围。
调用UpdateWindow函数刷新窗口 窗口的全部或者部分失效的时候 窗口从无到有 手动刷新窗口
调用InvalidateRect函数
9
获取设备描述表:方法二
该方法只适合于处理WM_PAINT消息
用BeginPaint“使无效窗口生效”并“返回 设备描述表句柄” 用EndPaint释放设备描述表句柄
如果采用SDK方法编程,获取DC的方法有两种:
在WM_PAINT消息处理函数中通过调用API函数 BeginPaint()获取设备环境,在消息处理函数返 回前调用API函数EndPaint()释放设备环境。在 其他函数中通过调用API函数GetDC()获取设备环 境,调用API函数ReleaseDC()释放设备环境。
13
MFC中获取DC的方法
在如OnDraw等函数中传递一个指向CDC 对象的指针 如OnDraw(CDC* pDC); 使用构造函数构建对象 一般不构造CDC对象 在CWnd类的OnPaint函数中,定义CPaintDC对象 CPaintDC dc(this); 在CWnd类的其它函数中,定义CClientDC和 CWindowDC的对象 CClientDC dc(this); CWindowDC dc(t口客户区左上角为原点,主要 用于客户区的绘图输出和窗口消息的处理。鼠标 消息的坐标参数使用客户区坐标,CDC类绘图成 员函数使用与客户区坐标对应的逻辑坐标。
坐标之间的相互转换
编程时,有时需要根据当前的具体情况进行三 种设备坐标之间或与逻辑坐标的相互转换。 MFC提供了两个函数 CWnd::ScreenToClient()和 CWnd::ClientToScreen()用于屏幕坐标与客 户区坐标的相互转换。
形象地说,一个设备环境提供了一张画布和一些
绘画的工具,我们可以使用不同颜色的工具在上 面绘制点、线、圆和文本。
在Windows中不使用DC无法进行输出,在使用
任何GDI绘图函数之前,必须建立一个设备环境 。
获取设备环境DC的方法:
在程序中不能直接存取DC数据结构,只能通过系
统提供的一系列函数或使用设备环境的句柄HDC 来间接地获取或设置设备环境结构中的各项属性 ,如显示器高度和宽度、支持的颜色数及分辨率 等。
Rectangle
RoundRec t Ellipse Arc ArcTo Pie Chord Polygon DrawIcon
根据指定的左上角和右下角坐标绘制一个矩形
绘制一个圆角矩形。 根据指定的矩形绘制一个内切椭圆 根据指定的矩形绘制内切椭圆上的一段弧边 该函数功能与Arc函数相同,不同之处在于画弧成功后 绘制扇形 绘制弦形,弦形是一条椭圆弧和其对应的弦所组成的封闭图形。 根据两个或两个以上顶点绘制一个多边形 在指定位置画一个图标,如果成功函数返回非0,否则返回0。
MFC的DC类包括CDC、CPaintDC、CClientDC
、CWindowDC等,其中CDC类是MFC设备环境 类的基类,其它的MFC设备环境类都是CDC的派 生类。
CDC类既作为其它MFC设备环境类的基类,又可
以作为一个一般的设备环境类使用。利用它可以 访问设备属性和设置绘图属性。CDC类对GDI的 所有绘图函数进行了封装。
移动画笔 MoveTo函数用于将当前绘图位置移到指 定的坐标点处,函数声明如下: CPoint MoveTo(int x, int y); CPoint MoveTo(POINT point); 参数x和y,及参数point指定了新的当前绘 图位置坐标。返回值是CPoint对象实例, 它包含了新的当前绘图位置坐标。
获取设备描述表:方法一
该方法适合于处理非WM_PAINT消息
用GetDC获取设备描述表句柄 用ReleaseDC释放设备描述表句柄