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