1 / 40

第六章 基于 MFC 的应用程序框架分析

第六章 基于 MFC 的应用程序框架分析. 一 . 什么是 MFC? 二 . 程序类和文件 三 . 程序框架中各个类的作用分析 四 . 程序的工作步骤分析 五 . 程序框架中各个对象的相互调用关系. 1 、概述

kobe
Download Presentation

第六章 基于 MFC 的应用程序框架分析

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第六章 基于MFC的应用程序框架分析 一. 什么是MFC? 二. 程序类和文件 三. 程序框架中各个类的作用分析 四. 程序的工作步骤分析 五. 程序框架中各个对象的相互调用关系

  2. 1、概述 微软基础类库(MFC:Microsoft Foundation Class)是微软为Windows程序员提供的一个面向对象的Windows编程接口,它大大简化了Windows编程工作。使用MFC类库的好处是:首先,MFC提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。 2、MFC类库的概念及组成 (1) 类库是一个可以在应用中使用的相互关联的C++类的集合。 一、什么是MFC?

  3. (2)Microsoft提供了一个基础类库MFC,其中包含用来开发C++和C++ Windows应用程序的一组类。基础类库的核心是以C++形式封装了大部分的Windows API。类库表示窗口、对话框、设备上下文、公共GDI对象如画笔、调色板、控制框和其他标准的Windows部件。这些类提供了一个面向Windows中结构的简单的C++成员函数的接口。 (3)MFC可分为两个主要部分: (1)基础类(2)宏和全程函数。

  4. 2、使用MFC生成一个应用程序 - MyDraw 创建新应用程序:

  5. 第一步:选择应用程序类型

  6. 第二步:选择支持的数据库类型

  7. 第三步:选择支持的OLE类型

  8. 第四步:选择应用程序包含的特征

  9. 第五步:设置其他特征

  10. 应用程序运行界面

  11. 在MFC应用程序中包含着四个主要的类: (1)文档类 (2)视图类 (3)主框架窗口类 (4)应用类 C++类在文件组织上一般分为两部分:头文件(.h)和实现文件(.cpp)。类和结构的定义放在头文件中,通过include宏插入实现文件中。实现文件用来存放类的各种函数的实际实现代码。 二、程序类和文件

  12. 由基类CDocument派生,文档类负责存放程序数据并读取磁盘文件数据,或将磁盘文件数据写入磁盘文件中。由基类CDocument派生,文档类负责存放程序数据并读取磁盘文件数据,或将磁盘文件数据写入磁盘文件中。 比如在建立一个图形系统时,存储图形的数据结构等都是放在文档类中的。 1、文档类

  13. 视图类是由CView类派生的,它负责显示文档类的数据,可以显示在屏幕上,也可以输出在打印机和其他设备上。在屏幕上,这个类管理客户窗口。视图类是由CView类派生的,它负责显示文档类的数据,可以显示在屏幕上,也可以输出在打印机和其他设备上。在屏幕上,这个类管理客户窗口。 例:在实现一个图形系统时,屏幕上显示、打印机绘图的工作都是由视图类完成的。 2、视图类

  14. 单文档的框架类由CFrameWnd类派生的。用来显示一个标题、一个菜单条、窗口的最大化和最小化按钮,边框,工具条以及状态条等。单文档的框架类由CFrameWnd类派生的。用来显示一个标题、一个菜单条、窗口的最大化和最小化按钮,边框,工具条以及状态条等。 多文档应用程序中包含两个框架类:主框架类CMainFrame,由MFC的CMDIFrameWnd类派生,提供了一个多文档界面主窗口的所有功能并管理主窗口中的子窗口,如显示一个标题、菜单条等等;子框架类CChildFrame由CMDIChildWnd派生,用来管理子窗口。子窗口只能在主窗口内显示,而不能在Windows桌面上显示。 3、框架类

  15. 应用类是由MFC的CWinApp类派生的。应用类管理程序的总体,它完成初始化、运行程序以及进行最后的程序清除工作。应用类是由MFC的CWinApp类派生的。应用类管理程序的总体,它完成初始化、运行程序以及进行最后的程序清除工作。 4、应用类

  16. 举例说明:用文稿、黑板,还有一些工具盒来组成一个工作环境或平台.举例说明:用文稿、黑板,还有一些工具盒来组成一个工作环境或平台. 文档类用来负责文稿的管理工作。 框架类负责黑板的管理工作。 视图类的作用是显示文稿的内容。 应用类负责建立启动这个工作环境。 三、程序框架中各个类的作用分析

  17. 运行时,应用程序框架首先获得控制权,依次执行下面的步骤:运行时,应用程序框架首先获得控制权,依次执行下面的步骤: 1、构造唯一的应用类对象theApp,调用CWinApp类的构造函数。 2、调用WinMain()函数。 WinMain()函数的工作又可细分为: 1)获得指向唯一应用类对象的指针。 2)进行一些内部初始化,若失败,转至第5)步。 3)进行应用程序的初始化,即调用InitInstance()函数进行初始化.如果失败,则调用应用类的ExitInstance ()函数,转至5)。 4)调用应用类的Run()函数,其功能主要是 进行消息循环,不断获取消息和处理消息。一直到用户关闭应用程序的窗口,产生WM_QUIT消息,调用ExitInstance ()函数,准备退出。 四、程序的工作步骤分析

  18. 5)进行应用程序的收尾工作,比如删除注册 的窗口类等。 6)返回。 3、从WinMain()函数返回后,删除应用程序的唯一应用类的对象,删除时要调用其析构函数。 4、终止应用程序。

  19. 1、视图类对象对文档类对象的调用 例:CDrawDoc *pDoc=GetDocumen( ); GetDocument()的作用是得到指向文档对象的指针。 2、在框架类对象中获得当前的文档和视图对象指针 例:CDrawDoc* pDoc=(CDrawDoc *)GetActiveDocument(); CDrawView* pView=(CDrawView *)GetActiveView( ); 3、获得应用类对象的指针 例:CDrawApp* pWinApp=(CDrawApp*)AfxGetApp(); 4、从应用类对象中获得主框架类对象的指针 例:CMainFrame* pFrame= (CMainFrame*)(AfxGetApp()->m_pMainWnd); 五、程序框架中各个类对象的相互调用关系

  20. 第七章 与图形操作有关的类及主要操作 一、绘图类简介: 绘图要用到MFC的类包括: CDC类、CPaintDC、CClientDC和CWindowDC等,其中CDC类是基础类。 1、CDC类 在Windows环境下,所有的图形输出都是在设备描述表(Device Context)上进行的.CDC类对设备描述表进行了封装,用来支持对屏幕或打印机所有的图形输出进行任务处理。

  21. 2、CPaintDC类 CPaintDC类,一般用在函数OnPaint()内,以响应WM_PAINT消息,WM_PAINT消息是在当窗口的某个区域需要重画时激发的当CPaintDC类的对象,接收到WM_PAINT消息时,自动调用固定的绘制函数,完成客户区的重画。

  22. 3、CClientDC类 CClientDC对象只能在客户区域绘图。客户区域不包括边框、标题栏和菜单栏。 如果窗口中有工具栏的话,点(0,0)指的是工具栏下最左边的点。 4、CWindowDC类 CWindowDC类的对象允许用户在显示器的任何地方绘图。包括窗口边框、标题栏等。 注意: 视图窗口没有非客户区域,因此CWindowDC更 适合于框架窗口,而不是视图窗口。

  23. 二、绘图对象类 绘图类可以选入绘图对象类来完成图形的 操作,主要绘图对象类有: 类 CGdiObject 类 CPen 类 CBrush 类 CFont 类 CRgn 类 CPalette 类 CBitmap

  24. 1、CGdiObject类是CObject类的派生类,它为不同的Windows图形设备界面(GDI)提供了基类。 1、CGdiObject类是CObject类的派生类,它为不同的Windows图形设备界面(GDI)提供了基类。 CGdiObject为他的派生类提供了大部分的操作,这些派生类初始化一个特定的GDI对象。 注意:不能直接建立一个CGdiObject对象。 2、建立CPen对象的方法 (1)CPen pen; pen.CreatePen(PS_SOLID,1,RGB(255,0,0)); (2)CPen pen (PS_SOLID,1,RGB(255,0,0)); (3)CPen* pen; pen=new CPen (PS_SOLID,1,RGB(255,0,0)); 删除画笔:delete pen;

  25. 画笔画线的线形,如下所示: 序号 名称 线形 1 PS_SOLID 2 PS_DASH 3 PS_DOT 4 PS_DASHDOT 5 PS_DASHDOTDOT 6 PS_NULL 注意:线形PS_DASH、 PS_DOT和PS_DASHDOT PS_DASHDOTDOT只有在画笔宽度为1个像素时才能使 用。

  26. 在绘图对象中选入画笔 void CDrawView::OnDraw(CDC* pDC) { CPen pen (PS_SOLID,1,RGB(255,0,0)); CPen* pOldPen=pDC->SelectObjent(&pen); // 将画笔选入绘图对象 .................//省略画图代码 pDC->SelectObject(pOldPen); //将画笔选出设备环境 }

  27. (3)构造CBrush对象的方法 实心画刷 (1)CBrush brush(RGB(255,0,0)); (2)CBrush* brush; brush=new CBrush(RGB(255,0,0)); .......... delete brush; (3)CBrush brush; brush.CreateSolidBrush(RGB(255,0,0));

  28. 影线画刷 (1)CBrush brush(HS_CROSS,RGB(255,0,0)); (2)CBrush* brush; brush=new CBrush(HS_CROSS,RGB(255,0,0)); .......... delete brush; (3)CBrush brush; brush.CreateSolidBrush(HS_CROSS,RGB(255,0,0));

  29. 影线画刷种类 序号 名称 填充模式 0 HS_HORIZONTAL 1 HS_VERTICAL 2 HS_FDIAGONAL 3 HS_BDIAGONAL 4 HS_CROSS 5 HS_DIAGCROSS

  30. 在绘图对象中选入画刷 void CDrawView::OnDraw(CDC* pDC) { CBrush brush(HS_CROSS,RGB(255,0,0)); //定义并初始化一个画刷实例。 CBrush* pOldBrush=pDC->SelectObject(&brush); //将画刷选入绘图对象 ......................//省略绘图代码 pDC->SelectObject(pOldBrush); //恢复原来的画刷 }

  31. (4)CRgn类 CRgn类封装了Windows图形设备界面区域,区 域可以是椭圆也可以是多边形。 CRgn类的构造函数只有一个,定义一个CRgn类 的对象后,对象不能直接被使用,必须调用一 个创建函数进行初始化以后才能被使用。

  32. 常用的创建函数: 1、BOOL CreateRectRgn(int x1,int y1,int x2,int y2); BOOL CreateRectRgnIndirect(LPCRECT lpRect); 初始画一个矩形区域。 CRgn m_Rgn; m_Rgn.CreateRectRgn(0,0,200,200); CRect rr; rr.left=0; rr.bottom=200; rr.right=200; rr.top=0; m_Rgn. CreateRectRgnIndirect(&rr);

  33. CRect类 类CRect与Windows的RECT结构类似,可通过执行它的成员函数来操作RECT结构。 typedef struct tagRECT {   LONG left;   LONG top;   LONG right;   LONG bottom; } RECT;

  34. CPoint类 类Cpoint起源于Windows的POINT结构,可通过执行它的成员函数来操作POINT结构。 typedef struct tagPOINT {   LONG x;   LONG y; } POINT; POINT用来指定一个点的x,y坐标。

  35. 2) BOOL CreateEllipticRgn(int x1,int y1, int x2,int y2);; BOOL CreateEllipticRgnIndirect(LPCRECT lpRect); 这两个函数分别和 BOOL CreateRectRgn(int x1,int y1,int x2,int y2); BOOL CreateRectRgnIndirect(LPCRECT lpRect); 相类似。

  36. (3) BOOL CreatePolygonRgn(LPPOINT lpPoints,int nCount,int nMode); 此函数创建一个封闭的多边形区域, lpPoints指向一个POINT结构或CPoint对象的数组, nCount是顶点的数目,nMode是多边形的填充模式。 例:CPoint point[3]; CRgn m_Rgn; point[0].x=100;point[0].y=100; point[1].x=200;point[1].y=10; point[2].x=100;point[2].y=200; m_Rgn.CreatePolygonRgn(point,3,0); pDC->Polygon(point,3); //绘制多边形区域,并用画刷填充。

  37. 字体的创建分两步 1)定义一个CFont类的对象。 CFont myFont; 2)调用CFont类的创建字体函数. myFont.CreateFont(...); CreateFont()函数原型如下: BOOL CreateFont(int nHight,//字体高度 int nWidth,//字符平均宽度 int nEscapement//文本行的角度 int nOrientation,//字符的角度 int nWeight,//字符粗细度 BYTE bItalic,//倾斜

  38. BYTE bUnderline,//下划线 BYTE cStrikeOut,//删除线 BYTE nCharSet,//字符集 BYTE nOutPrecision,//字体输出结果和要求 //的匹配程度 BYTE nClipPrecision,//如何剪裁落于剪裁区 //之外的字符。 BYTE nQuiality,//字符属性匹配的精确程度 BYTE nPitchAndFamily,//字体间距和字体族 LPCTSTR lpszFacename//字体名称 );

  39. 例:myFont.CreateFont( -50,//字体字符的逻辑高度 0,//字符平均宽度取默认值 900,//文本行角度为90度 900,//字符角度为90度 FW_NORMAL,//正常体 FALSE,//不倾斜 TRUE,//加下划线 FALSE,//不加删除线 ANSI_CHARSET,//标准字符集 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_MODERN, "Courier New" );

More Related