第3章 MFC绘图基础

合集下载

VC中MFC绘图详细教程

VC中MFC绘图详细教程
休息 14
前一页
休息
字体对象 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绘图

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交互绘图基础

第二章MFC交互绘图基础在上一章我们所创建的应用程序中,通过添加的菜单项实现了简单的用户和应用程序的交互。

用户可以通过选择菜单项,定义使用的画笔和画刷,并通过选择菜单项执行相应的绘图代码来看绘制的图形。

但是该应用程序有很多缺点,比如绘制的图形有限,想要绘制新的图形必须修改代码;通过菜单处理函数执行的绘图代码因为没有将图形的信息存储起来,导致图形在窗口进行视图重画时不能够正确显示等等。

通常情况下,用户需要使用更灵活的方式来绘制图形。

比如像Windows中的“画图”程序一样,用户使用鼠标绘制图形,可以更灵活方便的设置绘图使用的画笔和画刷的类型,并且希望绘制完的图形可以保存起来,以后可以再次打开以前所绘制的图形并进行编辑。

本章将以编写一个简单的绘图应用程序为例,介绍如何在MFC中实现鼠标绘图,如何定义图元的结构以保证应用程序可以正确的重画用户绘制的图形,如何选择和编辑已有的图形,如何保存图形到永久存储介质中等等的编程方法。

这个简单的绘图应用程序将实现以下基本功能:用户使用鼠标绘制图形;通过对话框设置绘制图形使用的线型和颜色以及填充封闭区域的模式和颜色;用户可以选择已经绘制的图形,并可以对该图形进行编辑;可以保存绘制完的图形到永久存储介质(这里是硬盘)中,以便以后可以读取以前绘制的图形,并再次进行编辑。

2.1创建工具条创建一个新的MFC项目,项目名称为DrawMap。

创建该项目时各步的设置与上一章中创建DrawTest项目时相同,只是在“MFC AppWizard – Step 4 of 6”对话框中不选择Printing and print preview复选框。

在上一章的应用程序中,用户需要通过选择菜单项来选择要执行的功能。

当菜单项的层数比较多的时候,用户需要点击的次数较多。

对于一些常用的功能,用户会希望能够更容易的选择到,此时就可以使用工具条。

对于本章中要创建的绘图应用程序来说,绘图功能是常用功能,所以可以将这些功能的选择做成工具条。

MFC基本的图形绘制 CDC类

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绘图教程

MFC绘图教程
3/21/2011 12
常用颜色对照表
例: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基本绘图函数使用方法
三. 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优秀课件

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 画图课程设计一、教学目标本课程旨在通过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%。

MFC画图程序步骤

MFC画图程序步骤

MFC画图程序步骤MFC(Microsoft Foundation Class)是一种用于开辟Windows应用程序的C++类库。

在MFC中,我们可以使用GDI(Graphics Device Interface)来创建和操作图形。

下面是使用MFC创建一个简单的画图程序的步骤。

步骤1:创建一个新的MFC项目首先,打开Visual Studio并选择创建一个新的项目。

在项目类型中,选择Visual C++ -> MFC,然后选择MFC应用程序类型。

输入项目名称并选择保存的位置。

在应用程序类型中,选择“单文档”或者“多文档”视图,具体根据你的需求而定。

点击“确定”按钮创建项目。

步骤2:设计用户界面在MFC应用程序中,用户界面是通过对话框资源来设计的。

在资源视图中,双击IDD_DIALOG(或者其他对话框资源)以打开对话框编辑器。

在对话框编辑器中,你可以添加按钮、文本框、菜单等控件来设计你的用户界面。

在画图程序中,你可以添加一个画布控件来显示绘制的图形。

步骤3:添加绘图功能在MFC中,你可以使用GDI来进行绘图操作。

打开你的对话框类的头文件(例如,CMyDialog.h),添加以下头文件引用:#include <afxwin.h>#include <afxext.h>#include <afxdisp.h>在对话框类的源文件(例如,CMyDialog.cpp)中,添加以下代码来处理绘图操作:```void CMyDialog::OnPaint(){CPaintDC dc(this); // 用于绘制的设备上下文// 在这里进行绘图操作dc.Rectangle(100, 100, 200, 200); // 绘制一个矩形dc.Ellipse(300, 100, 400, 200); // 绘制一个椭圆}```步骤4:处理绘图事件在对话框类的消息映射中添加对绘图事件的处理。

mfc绘图课程设计

mfc绘图课程设计

mfc绘图课程设计一、课程目标知识目标:1. 学生能理解MFC(Microsoft Foundation Class)的基本概念及其在绘图中的应用;2. 学生能掌握MFC绘图程序的基本框架和常用绘图工具的使用;3. 学生能了解并运用MFC中的颜色、画笔、画刷等绘图属性。

技能目标:1. 学生能运用MFC编写简单的绘图程序;2. 学生能通过MFC实现基本的图形绘制,如线条、矩形、椭圆等;3. 学生能通过MFC实现图形的填充、旋转等变换。

情感态度价值观目标:1. 培养学生对计算机绘图产生兴趣,激发其主动探索精神;2. 培养学生在团队合作中相互学习、交流,形成良好的合作氛围;3. 培养学生具备创新思维,敢于尝试新方法,提高解决问题的能力。

课程性质:本课程为信息技术学科选修课程,适用于对计算机绘图有兴趣的学生。

学生特点:学生具备一定的编程基础,对MFC有一定了解,具有较强的学习能力和探索精神。

教学要求:课程要求教师引导学生主动探索,通过实践操作,掌握MFC绘图的相关知识和技能。

在教学过程中,注重培养学生的动手能力和创新能力。

教学评估以学生的实际操作和绘图作品为依据。

二、教学内容1. MFC绘图基础理论:- MFC概述及其在绘图中的应用;- 常用绘图工具和类的介绍。

2. MFC绘图程序框架:- 创建MFC绘图程序的基本步骤;- 常用绘图函数和功能介绍。

3. 图形绘制与变换:- 线条、矩形、椭圆等基本图形的绘制;- 图形的填充、旋转等变换操作。

4. MFC绘图进阶应用:- 颜色、画笔、画刷等绘图属性的应用;- 综合实例分析,实现复杂图形的绘制。

教学大纲安排:第一课时:MFC绘图基础理论,介绍MFC及其在绘图中的应用,学习常用绘图工具和类。

第二课时:MFC绘图程序框架,学习创建MFC绘图程序的基本步骤和常用绘图函数。

第三课时:图形绘制与变换,实践绘制基本图形和实现图形的填充、旋转等变换。

第四课时:MFC绘图进阶应用,学习颜色、画笔、画刷等绘图属性的应用,分析综合实例。

MFC画图的基本方法

MFC画图的基本方法

MFC画图的基本方法1.画笔类,CPen,创建画笔类的对象后,需要调用CreatePen(......)函数创建画笔。

然后将其选入设备描述表中。

pDC->SelectObject(.......);2.设置起点坐标。

在这里调用一个函数来设置坐标原点。

pDC->SetViewportOrg(100,255);3.调用LineTo(point),MoveTo(Point)函数画图。

4.删除创建的画笔对象。

pen.DeleteObject();以下是今天所写的画正弦函数的图像。

创建一个单文档的应用程序。

并且在VIEW类中的OnDraw(。

)函数里面做消息响应。

由于调用了sin()函数,所以要把math.h头文件包含进来。

#include "math.h"void CDrawSinXView::OnDraw(CDC* pDC){CDrawSinXDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data here//建立画笔CPen pen_Zuobixi,pen_sinx;pen_Zuobixi.CreatePen(PS_SOLID,4,RGB(0,0,0));pen_sinx.CreatePen(PS_SOLID,2,RGB(0,0,255));pDC->SelectObject(&pen_Zuobixi);//指定原点pDC->SetViewportOrg(100,255);pDC->SetTextColor(RGB(255,0,0));//绘制横坐标CString sPIText[]={"-1/2π","","1/2π","π","3/2π","2π","5/2π","3π","7/2π","4π","9/2π","5π"};int n=-1;int nTemp=0;while (nTemp<=660){pDC->LineTo(60*n,0);pDC->LineTo(60*n,-5);pDC->MoveTo(60*n,0);pDC->TextOut(60*n-sPIText[n+1].GetLength()*3,16,sPIText[n+1]);n++;nTemp +=60;}pDC->MoveTo(0,0);CString strTemp;//绘制纵坐标for(n=-4,nTemp = 0;nTemp<=180;n++,nTemp+=60) {pDC->LineTo(0,60*n);pDC->LineTo(5,60*n);pDC->MoveTo(0,60*n);strTemp.Format("%d",-n);pDC->TextOut(10,60*n,strTemp);}double y,radian;pDC->SelectObject(&pen_sinx);for(int x=-60;x<600;x++){//弧度=X坐标/曲线宽度*角系数*π//Y坐标=振幅*曲线宽度*sin(弧度)radian =x/((double)60*2)*PI;y=sin(radian)*2*60;pDC->MoveTo((int)x,(int)y);pDC->LineTo((int)x,(int)y);}pen_sinx.DeleteObject();。

MFC GDI绘图基础

MFC GDI绘图基础

MFC GDI绘图基础一.关于GDI的基本概念什么是GDI?Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上。

在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素、在打印机上输出硬拷贝以及绘制Windows用户界面功能。

在Visual C++6.0中的头文件C:\Program Files\Microsoft Visual Studio\VC98\Include\wingdi.h和Visual Studio 2005中的头文件C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\WinGDI.h是访问gdi32.dll库文件的钥匙。

下面我们大致浏览一下wingdi.h(included in Windows.h)头文件:/* Bitmap Header Definition */定义了BITMAP位图结构/* Mapping Modes */定义了DC中的坐标映射方式,包括以下常用函数:SetMapMode、SetViewportExtEx、SetViewportOrgEx、SetWindowExtEx 、SetWindowOrgEx。

/* Stock Logical Objects */系统预定义的堆(STOCK)对象,包括BRUSH、PEN和FONT 对象/* Brush Styles */定义了画刷格式,包括SOLID、HOLLOW、HATCHED等格式/* Hatch Styles */定义了画刷阴影格式,包括:HS_VERTICAL /* ||||| */HS_FDIAGONAL /* \\\\\ */HS_BDIAGONAL /* ///// */HS_CROSS /* +++++ */HS_DIAGCROSS /* xxxxx *//* Pen Styles */定义了画笔格式,包括SOLID、DASH、DOT等格式什么是DC?设备环境DC(Device Context),也称为设备描述表或设备上下文。

MFC绘图基础.

MFC绘图基础.

MFC绘图基础.先认识⼀下MFC中的⼀些和绘图有关的结构体和类1.点(1)点结构POINT点数据结构POINT⽤来表⽰⼀点的x、y坐标:typedef struct tagPOINT {LONG x;LONG y;} POINT;(2)点类CPoint点类CPoint为⼀个没有基类的独⽴类,封装了POINT结构,有成员变量x和y其构造函数有5种:CPoint( );CPoint( int initX, int initY );CPoint( POINT initPt );CPoint( SIZE initSize );CPoint( LPARAM dwPoint );// 低字设为x、⾼字设为yCPoint类还定义了4个平移和设置函数:void Offset(int xOffset, int yOffset);void Offset(POINT point);void Offset(SIZE size);void SetPoint(int X, int Y);CPoint类还重载了+、-、+=、-=、==、!=等运算符来⽀持CPoint对象和CPoint、POINT、SIZE对象之间的运算。

2.⼤⼩(1)⼤⼩结构SIZE⼤⼩(size尺⼨)结构SIZE⽤来表⽰矩形的宽cx和⾼cy:typedef struct tagSIZE {LONG cx;LONG cy;} SIZE(2)⼤⼩类CSize⼤⼩类CSize也为⼀个没有基类的独⽴类,封装了SIZE结构,有成员变量cx和cy其构造函数也有5种:CSize( );CSize( int initCX, int initCY );CSize( SIZE initSize );CSize( POINT initPt );CSize( DWORD dwSize ); // 低字设为cx、⾼字设为cyCSizet类也重载了+、-、+=、-=、==、!=等运算符来⽀持CSize对象和CSize、POINT、SIZE、RECT对象之间的运算3.矩形(1)矩形结构RECT矩形结构RECT定义了矩形的左上⾓与右下⾓的坐标:typedef struct tagRECT {LONG left;LONG top;LONG right;LONG bottom;} RECT;(2)矩形类CRect矩形类CRect也为⼀个没有基类的独⽴类,封装了RECT结构,有成员变量left、top、right和bottom其构造函数有6种:CRect( );CRect( int l, int t, int r, int b );CRect( const RECT& srcRect );CRect( LPCRECT lpSrcRect );CRect( POINT point, SIZE size );CRect( POINT topLeft, POINT bottomRight );CRect类重载了=,+、-,+=、-=,==、!=,&、|,& =、|=等运算符来⽀持CRect对象和CRect、POINT、SIZE、RECT对象之间的运算。

第三章MFC绘图

第三章MFC绘图

7/22/2013
18
6.OnDraw与OnPaint的区别
OnDraw是CView类的成员函数,不响应消息;OnPaint是 CWnd类的成员函数,响应WM_PAINT消息。 CView默认调用的OnPaint函数如下
void CView::OnPaint() { CPaintDC dc(this); OnPrepareDC(&dc); OnDraw(&dc); //调用了OnDraw }
3.4重绘
为什么要重绘? 如何重绘? 在ondraw中重新绘制窗口内容: 把OnLButtonDown事件中的绘制图形 代码写在ondraw函数中。
7/22/2013
28
新的问题: 1)程序一开始就把OnLButtonDown事件 中绘制的图形画好了。 解决办法: 使用if控制:如果没有发生 OnLButtonDown事件,则不在ondraw中 重绘。 怎么实现?
文本:以图形方式输出文本,以逻辑坐标为单位计算输 出位置,而DOS是以行为单位。用户可以设置文本的各 种效果,如加粗、斜体、设置颜色等。
7/22/2013
3
2.设备上下文
应用程序的输出面向设备环境(Device Context,DC),是 一个虚拟逻辑设备,也称设备描述表或设备上下文。设备 环境DC 是由GDI 创建,用来代表设备连接的数据结构。 DC 的主要功能
7/22/2013
17
5.Windows系统发送WM_PAINT消息的时机
第一次创建一个窗口时 改变窗口的大小时 把窗口从另一个窗口背后移出时 窗口显示数据变化时,应用程序引发重绘操作
通过CWnd::Invalidate、CWnd::InvalidateRect或 CWnd::InvalidateRgn函数把指定区域加到窗口的 Update Region中。 窗口的Update Region不为空时,系统会自动产生 WM_PAINT消息。

MFC绘图基础——上机操作步骤

MFC绘图基础——上机操作步骤

MFC绘图基础——上机操作步骤⼀、上机之前的介绍软件环境:VC++6.0⽬的:熟悉基本的MFC框架搭建和了解界⾯⼆、MFC上机操作步骤1,在Windows桌⾯上运⾏VC++6.0。

2,新建项⽬⼯程⽂件。

3,在MFC 应⽤程序向导-步骤1 对话框中,选中单⽂档单选按钮,其余保持默认。

4,弹出新建⼯程信息的对话框,单击确定。

5,完成上述步骤后,⼯程Testone的MFC框架已经⽣成。

6,在集成开发环境的左侧⼯作窗⼝中有3个标签页。

ClassView 显⽰所创建的类和成员函数ResourceView 显⽰所创建的资源FileView 显⽰程序⽂件,主要包括程序源⽂件、头⽂件和资源⽂件7,在CTestView 类的源⽂件TestView.cpp中可以找到成员函数OnDraw()。

其内容如下:void CTestoneView::OnDraw(CDC* pDC){CTestoneDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here}其中pDC定义为CDC类的指针。

pDoc通过GetDocument()函数得到了指向⽂档类CTestoneDoc的指针。

ASSERT_VALID(pDoc)函数使pDoc指针有效。

使⽤pDC指针,可以对CDC类的成员函数进⾏操作。

注意:OnDraw()函数是由系统框架直接调⽤的,每当窗⼝重绘时就会⾃动执⾏。

8,单击⼯具条上的按钮,就可以直接编译、运⾏程序。

三、结束语⾄此,尽管未编写⼀⾏代码,但Test⼯程已经形成⼀个可执⾏程序的框架了。

以后的⼯作就是针对具体的设计任务,为该框架添加⾃⼰的程序代码。

接下来就是Coding~~~。

实验一 基于MFC的绘图基础

实验一 基于MFC的绘图基础

实验一基于MFC的绘图基础
一、实验目的与要求
1、熟悉Visual C++的界面
2、掌握MFC的上机操作步骤
3、了解计算机的设备坐标系
4、理解计算机图形显示的像素概念
5、理解RGB色彩模型
6、掌握MFC中画点函数的用法
7、掌握MFC中画笔的用法
8、掌握利用画笔完成直线的绘制的方法
二、实验内容
1、利用应用程序向导生成单文档的应用程序。

工程名用中文名;在CMyView类中的OnDraw函数中添加绘图的相应代码,由于OnDraw函数是系统框架自动生成的,所以编译后执行程序就可以马上看到绘图的成果。

2、进行代码添加。

1.用SetPixel函数画点(这里的点就是像素),利用for循环连续地画点就形成一条直线,试分别作出水平,垂直和45°的三条直线,直线用渐变的颜色显示出来(原理是对每个点设置不同的颜色,对RGB色彩模型的参数值做递增或递减);
2.利用MFC中的画笔来画直线,尝试画笔的不同样式;首先定义一个画笔,然后画线用MoveTo和LineTo函数完成。

三、实验成果
水平的直线(红色渐进)如下图:
垂直的直线(绿色渐进)如下图:
45°倾斜的直线(蓝色渐进)如下图:
2画笔画直线。

MFC基本绘图—简单画图工具开发

MFC基本绘图—简单画图工具开发


两个参数分别表示:刷子的填充样式,刷子的颜色。
构造函数: CBrush( COLORREF crColor ) CBrush( int nIndex ,COLORREF crColor)
nIndex填充样式的6种风格
水平线 竖直线 向下斜线 向上斜线 十字线 交叉线

HS_HORIZONTAL HS_VERTICAL HS_BDIAGNAL HS_FDIAGONAL HS_CROSS HS_DIAGCROSS
pDC->SelectObject(&DrawBrush);
pDC->Rectangle(rc); //绘制带有填充样式的矩形 pDC->SelectObject(pOldBrush); }
实验步骤指导
1.应用AppWizard向导生成一个单文档应用程序 2. 增加若个按钮控制绘图工具和相关设置。
0 1 2 3 4 5
void CListDlg::Draw()
{
CWnd* pWnd=GetDlgItem(IDC_STATIC_DRAW); CDC* pDC=pWnd->GetDC();
CBrush BkBrush, DrawBrush;
BkBrush.CreateSolidBrush(m_BkColor); DrawBrush.CreateHatchBrush(m_DrawPattern, m_ForeColor);

具体要求: a. 工具选择按钮: 直线 矩形 b.画笔颜色设置 RGB设置,利用edit设置 c.笔刷设置 RGB设置,利用edit设置

3. 增加消息相应处理函数完成绘图功能。
具体要求: a. 工具选择按钮: 直线 矩形 b.画笔颜色设置 RGB设置,利用edit设置 宽度 样式 c.笔刷设置 RGB设置,利用edit设置

mfc画图课程设计

mfc画图课程设计

mfc 画图课程设计一、课程目标知识目标:1. 学生能理解MFC(Microsoft Foundation Classes)的基本概念,掌握MFC画图程序的基本结构。

2. 学生能运用MFC中的画图工具,如画笔、画刷、线条、矩形等,进行简单的图形绘制。

3. 学生了解并掌握MFC中的颜色设置、图形填充等操作。

技能目标:1. 学生能独立创建一个MFC画图程序,并运用各种工具进行图形绘制。

2. 学生能通过MFC画图程序,将所学知识应用于实际问题,提高编程解决问题的能力。

3. 学生能在团队协作中,共同完成一个复杂的画图作品,提高沟通与协作能力。

情感态度价值观目标:1. 培养学生对计算机编程的兴趣,激发学习积极性,增强自信心。

2. 培养学生良好的编程习惯,注重代码规范,提高代码质量。

3. 培养学生的创新意识和团队精神,鼓励学生互相学习、互相帮助,共同进步。

课程性质:本课程为信息技术课程,旨在让学生掌握MFC画图的基本操作,培养编程兴趣和实际操作能力。

学生特点:学生处于高年级阶段,具备一定的编程基础,对MFC画图有一定了解,但实际操作能力较弱。

教学要求:结合学生特点和课程性质,以实践操作为主,注重培养学生的动手能力和团队协作能力。

将课程目标分解为具体的学习成果,便于后续教学设计和评估。

二、教学内容1. MFC基本概念介绍:MFC画图程序的框架结构、常用类和对象的作用。

2. 画图工具的使用:画笔、画刷、线条、矩形、椭圆等图形绘制方法。

3. 颜色设置与图形填充:颜色设置、画刷填充、渐变填充等操作。

4. MFC画图程序实例:创建一个简单的MFC画图程序,演示各种画图工具的使用。

5. 综合实践:分组进行团队协作,完成一个具有实际意义的画图作品。

6. 代码优化与规范:讲解编程规范,提高代码可读性和维护性。

教学大纲安排:第一课时:MFC基本概念介绍,了解MFC画图程序的框架结构。

第二课时:学习画笔、画刷、线条等基本画图工具的使用。

第3章MFC绘图基础..

第3章MFC绘图基础..
CPaintDC类是OnPaint()函数使用的设备环境类
,它代表一个窗口的绘图画面。如果添加 WM_PAINT消息处理函数OnPaint(),就需要使 用CPaintDC类来定义一个设备环境对象。
CClientDC类代表了客户区设备环境。当在客户
区实时绘图时,需要利用CClientDC类定义一个 客户区设备环境。
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。
如果采用SDK方法编程,获取DC的方法有两种:
在WM_PAINT消息处理函数中通过调用API函数 BeginPaint()获取设备环境,在消息处理函数返 回前调用API函数EndPaint()释放设备环境。在 其他函数中通过调用API函数GetDC()获取设备环 境,调用API函数ReleaseDC()释放设备环境。

调用UpdateWindow函数刷新窗口 窗口的全部或者部分失效的时候 窗口从无到有 手动刷新窗口

调用InvalidateRect函数
9
获取设备描述表:方法二

MFC经典绘图方法总结

MFC经典绘图方法总结

MFC经典绘图方法总结Windows 绘图的实质就是利用windows提供的图形设备接口GDI(Graphics Device Interface)将图形会制在显示器上。

为了支持GDI绘图,MFC提供了两种重要的类:设备上下文DC(Device Context)类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。

CDC类介绍:在MFC中,CDC是设备上下文类的基类,派生类包括:CClientDC, CPaintDC, CWindowDC, CMetaFileDC类CClientDC 客户区设备上下文,绘制客户区时CPaintDC 一般发生在窗口需要重绘时CWindwDC 可以绘制整个窗口,通常在窗口WM_NCPAINT消息的响应函数CWnd::OnNCPaint()中使用CMetaFileDC 专门用于图元文件的绘制,图元文件记录一组GDI命令,重建图形输出。

CDC包含m_hDC和m_hAttribDC二个设备上下文。

CDC指导所有对m_hDC的输出GDI调用(SetTextColor)以及对m_hAttribDC的大部分属性GDI调用(GetTextColor)。

CDC对象的重要函数如下:1、为指定设备创建上下文virtual BOOL CreateDC(...)比如创建一个为屏幕的设备上下文CDC dc;dc.CreateDC("DISPLAY", NULL, NULL,NULL);2、创建内存设备上下文,与指定设备上下文兼容virtual BOOL CreateCompatibleDC( CDC * pDC)3、删除CDC对象对应的Windows设备上下文, 通常不调用该函数而是使用析构程序virtual BOOL DeleteDC();4、将HDC句柄转化为设备上下文的句柄: CDC *pDC=CDC::FromHandle( hDC )5、选择GDI对象入选到设备上下文中,一共有五种形式:CPen * SelectObject( CPen * pPen) ;CBrush * SelectObject( CBrush * pBrush) ;virtual CFont * SelectObject( CFont * pFont) ;CBitmap * SelectObject( CBitmap * pBitmap) ;int SelectObject( CRgn * pRgn) ;例:Cpen cpen;pen.CreatePen( PS_SOLID, 2, RGB(255,0,0) );Cpen *pOldPen=(CPen*)pDC->SelectObject(&pen); //设置新画笔,记录旧画笔....pDC->SelectObject(pOldPen); //还原画笔三种方法创建画笔1/构造函数:CPen();CPen( int nPenStyle, int nWidth, COLORREF crColor );CPen(...)略2/CreatePen( int nPenStyle, int nWidth, COLORREF crColor )3/CreatePenIndirect( LPLOGPEN lpLogpen )typedef struct tagLOGPEN{UINT lopnStyle;POINT lopnWidth;COLORREF lopnColor;}LOGPEN, *LPLOGPEN;例:LOGPEN lppn;lppn.lopnColor=RGB(255,0,0);lppn.lopnStype=PS_DASHDOT;lgpn.lopnWidth.x=2;lgpn.lopnWidth.y=2;CPen pen;pen.CreatePenIndirect( &lppn );画刷三种方法创建1/构造函数:CBrush();CBrush(COLROREF crColor);CBrush(int nIndex, COLORREF crColor);nIndex 哪种类型的网格, HS_BDIAGONAL HS_CROSSHS_VERTICAL HS_HORIZONTAL2/CreateSolidBrush( COLORREF crColor);3/CreateHatchBrush( int nIndex , COLORREF crColor );4/CreateBrushIndirect( const LOGBRUSH* lpLogBrush );typedef struct tagBRUSH{UINT lbStyle; // BS_HA TCHED, BS_SOLID , BS_NULLCOLORREF lopnColor;LONG lbHatch; //HS_BDIAGONAL HS_CROSS HS_VERTICAL HS_HORIZONTAL}LOGBRUSH, *LPLOGBURSH;例:CRect Rect(0,0,200,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle(Rect);pDC->SelectObject( pOldBursh);图形绘制1.点绘制//返回RGB值COLORREF SetPixel(int x, int y, COLORREF crColor);COLORREF SetPixel(POINT point, COLORREF crColor);//返回BOOL值,绘制是否成功.BOOL SetPixelV(int x, int y, COLORREF crColor);BOOL SetPixelV(POINT point, COLORREF crColor);2.直线绘制//返回CPoint对象的x和y坐标的前一次取值CPoint MoveTo(int x, int y);CPoint MoveTo(POINT point);//返回绘制是否成功BOOL MoveTo(int x, int y);BOOL MoveTo(POINT point);例:CPen pen;pen.CreatePen(PS_SOLID,2,RGB(0,255,0));CPen* oldPen =(CPen *)pDC->SelectObject(&pen);CPoint oldPoint=pDC->MoveTo(600,300);pDC->LineTo(500,500);3.矩形绘制1/矩形绘制BOOL Rectangle( int x1, int y1, int x2, int y2 );BOOL Rectangle( LPRECT lpRect);例:pDC->SelectObject( oldPen);pDC->Rectangle(0,0,600,300);CRect Rect(0,0,300,200);CBrush brush(HS_HORIZONTAL,RGB(0,255,0));CBrush *pOldBursh=pDC->SelectObject(&brush);pDC->Rectangle( &Rect );pDC->SelectObject( pOldBursh);例:CPen pen;pen.CreatePen(PS_DASH, 1,RGB(255,0,0));LOGBRUSH lb;memset( &lb,0, sizeof(lb));lb.lbStyle=BS_HATCHED;lb.lbHatch=HS_DIAGCROSS;CBrush brush;brush.CreateBrushIndirect( &lb);CPen *pOldPen=(CPen *)pDC->SelectObject( & pen);CBrush *pOldBrush=(CBrush*)pDC->SelectObject(&brush);pDC->Rectangle(0,0,200,200);pDC->SelectObject( pOldPen);pDC->SelectObject( pOldBrush);2/三维矩形线框绘制void Draw3dRect(int x, int y, int cx, int cy , COLORREF clrTopLeft, COLORBEF clrBottomRight );void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORBEF clrBottomRight );例:pDC->Draw3dRect(100, 100, 200, 300, RGB(255,0,0), RGB(0,255,0));3/表示焦点风格矩形void DrawFocusRect( LPCRECT lpRect);例:CRect rt( 400,400, 450, 450);pDC->DrawFocusRect( &rt);4/绘制拖曳形线框void DrawDragRect(LPCRECT lpRect , SIZE size LPCRECT lpRectLast, SIZE sizeLast, CBrush* pBrush=NULL , CBrush* pBrushLast=NULL);5/圆角矩形void RoundRect(LPCRECT lpRect , POINT point); //point.x 椭圆宽, point.y 椭圆高void RoundRect(int x1, int y1, int x2, int y2, int x3, int y3 );例:pDC->RoundRect(250, 250, 400, 400, 50, 100);4.椭圆绘制BOOL Ellipse( LPCRECT lpRect ) //椭圆的外接矩形范围文字绘制TextOut函数返回值是BOOLBOOL TextOut( int x, int y, const CString & str );virtual BOOL TextOut(int x, int y, LPCSTR lpszString, int nCount);DrawText函数返回值是文本高度int DrawText ( LPCSTR lpszString, int nCount, LPRECT lpRect, UNIT nFormat);int DrawText ( const CString& str, LPRECT lpRect, UNIT nFormat); //DT_BOTTOM DT_LEFT...//注意:如果nFormat 参数指定了DT_CALCRECT标志,由lpRect指定的矩形将会更新,以反映显示文本需要的高度和宽度,但并不绘制显示文字背景色和前景色virtual COLORREF SetBKColor( COLORREF crColor);int SetBKMode( int nBKMode); // nBKMode: OPAQUE, TRANSPARENT时,SetBKColor失效例:CRect rect;GetClientRect(&rect);pDC->FillSolidRect(rect,RGB(0,0,255));CString strText=L"VC++ BKColor Demo...";pDC->SetTextColor(RGB(255,255,255));pDC->SetBkColor(RGB(255,0,0));pDC->SetBkMode(TRANSPARENT);pDC->TextOut(10,10,strText);文字字体设置文字的字体会使用到MFC下的CFont类,然后调用CFont类下的四个成员函数: CreateFont, CreateFontIndirect, CreatePointFont和CreatePointFontIndirect,详见msdn帮助例:1/CreateFont 函数CFont font;font.CreateFont(25,0,1800,0,FW_BOLD,1,1,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,L"Courier New");CString strText=L"VC++ Font Demo...";pDC->SetTextColor( RGB(255,0,0));CFont *pOldFont=(CFont*)pDC->SelectObject(&font);pDC->TextOut(210,210, strText);pDC->SelectObject(pOldFont);2/ CreateFontIndirect(const LOGFONT* lpLogFont);typedef struct tagLOGFONT{//14个成员变量与世隔绝CreateFont函数类似}LOGFONT;3/如果只注重字体的高度和字体名时,使用CreatePointFont(int nPointSize, LPCSTR lpszFaceName, CDC* pDC=NULL);位图显示A:位图介绍,CBitmap类封装了Windows图形设备接口中的位图,并提供了操作位图的成员函数1/创建兼容位图,使之与指定设备兼容.BOOL CreateCompatibleBitmap(CDC *pDC, int nWidth, int nHeight);2/得到位图信息,作用是填充BITMAP结构.int GetBitmap(BITMAP * pBitMap);3/加载位图资源,加载一个命名的位图资源来初始化位图对象.BOOL LoadBitmap( LPCSTR lpszResourceName);BOOL LoadBitmap( UINT nIDResuource );B:显示位图,VC++提供BitBlt, StretchBlt和TransparentBit(需加入msimg32.lib库) 1/ BOOL BitBlt(int x , int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );//尺寸不变2/ BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC,int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop); //支持缩放/* dwRop一般设置为SRCCOPY */3/ BOOL TransparentBlt( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest,HDC hdcSrc, int nXoriginSrc, int nYOriginSrc, int nWidthSrc, int nHeightSrc, UINT crTransparent);例:CBitmap bitmap;bitmap.LoadBitmap(IDB_BITAMBOW);BITMAP bm;bitmap.GetBitmap(&bm);CDC MemDC;MemDC.CreateCompatibleDC(pDC);CBitmap* pOldBitmap=(CBitmap *)MemDC.SelectObject(&bitmap);CRect rect(10,10, bm.bmWidth, bm.bmHeight);TransparentBlt(pDC->GetSafeHdc(), rect.left, rect.top, rect.Width()*5, rect.Height()*5, MemDC.GetSafeHdc(), 0, 0, bm.bmWidth, bm.bmHeight, RGB(0,0,0));//长宽扩大5倍,图片中黑色的部分将作为透明处理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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释放设备描述表句柄
相关文档
最新文档