40
第第第 第第 MFC 第第第第第第第第第 . 第第第 MFC? 第 . 第第第第第第 第 . 第第第第第第第第第第第第第 第 . 第第第第第第第第第 第 . 第第第第第第第第第第第第第第第第

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

  • Upload
    kobe

  • View
    106

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

一 . 什么是 MFC?

二 . 程序类和文件三 . 程序框架中各个类的作用分析四 . 程序的工作步骤分析五 . 程序框架中各个对象的相互调用关系

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

一、什么是 MFC?1 、概述 微软基础类库( MFC : Microsoft Foundation Cl

ass )是微软为 Windows 程序员提供的一个面向对象的 Windows 编程接口,它大大简化了 Windows 编程工作。使用 MFC 类库的好处是:首先, MFC 提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准 Windows 应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。

2 、 MFC 类库的概念及组成( 1 ) 类库是一个可以在应用中使用的相互关联的 C++

类的集合。

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

( 2 ) Microsoft提供了一个基础类库MFC,其中包含用来开发 C++和 C++ Windows应用程序的一组类。基础类库的核心是以 C++形式封装了大部分的Windo

ws API。类库表示窗口、对话框、设备上下文、公共GDI对象如画笔、调色板、控制框和其他标准的Wind

ows部件。这些类提供了一个面向Windows中结构的简单的 C++成员函数的接口。

( 3 ) MFC可分为两个主要部分: ( 1)基础类( 2)宏和全程函数。

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

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

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

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

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

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

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

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

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

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

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

第五步:设置其他特征

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

应用程序运行界面

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

二、程序类和文件在 MFC 应用程序中包含着四个主要的类:

( 1 )文档类 ( 2 )视图类 ( 3 )主框架窗口类 ( 4 )应用类 C++ 类在文件组织上一般分为两部分:

头文件( .h )和实现文件 (.cpp) 。类和结构的定义放在头文件中,通过 include 宏插入实现文件中。实现文件用来存放类的各种函数的实际实现代码。

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

1 、文档类

由基类 CDocument 派生,文档类负责存放程序数据并读取磁盘文件数据,或将磁盘文件数据写入磁盘文件中。

比如在建立一个图形系统时,存储图形的数据结构等都是放在文档类中的。

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

2 、视图类

视图类是由 CView 类派生的,它负责显示文档类的数据,可以显示在屏幕上,也可以输出在打印机和其他设备上。在屏幕上,这个类管理客户窗口。

例:在实现一个图形系统时,屏幕上显示、打印机绘图的工作都是由视图类完成的。

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

3 、框架类单文档的框架类由 CFrameWnd 类派生的。用来显示一个标题、一个菜单条、窗口的最大化和最小化按钮,边框,工具条以及状态条等。

多文档应用程序中包含两个框架类:主框架类 CMainFrame ,由 MFC 的 CMDIFrameWnd 类派生,提供了一个多文档界面主窗口的所有功能并管理主窗口中的子窗口,如显示一个标题、菜单条等等;子框架类 CChildFrame 由 CMDIChildWnd 派生,用来管理子窗口。子窗口只能在主窗口内显示,而不能在 Window

s 桌面上显示。

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

4 、应用类

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

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

三、程序框架中各个类的作用分析

举例说明:用文稿、黑板,还有一些工具盒来组成一个工作环境或平台 .

文档类用来负责文稿的管理工作。 框架类负责黑板的管理工作。 视图类的作用是显示文稿的内容。 应用类负责建立启动这个工作环境。

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

四、程序的工作步骤分析运行时,应用程序框架首先获得控制权,依次执行下面的步骤: 1 、构造唯一的应用类对象 theApp ,调用 CWinApp 类的构造函数。

2 、调用 WinMain ()函数。 WinMain() 函数的工作又可细分为:

1 )获得指向唯一应用类对象的指针。 2 )进行一些内部初始化,若失败,转至第 5 )步。 3 )进行应用程序的初始化,即调用 InitInstance() 函数进行

初始化 . 如果失败,则调用应用类的 ExitInstance () 函数,转至 5 )。

4 )调用应用类的 Run ()函数,其功能主要是 进行消息循环,不断获取消息和处理消息。一直到用户关闭应用程序的窗口,产生 WM_QUIT消息,调用 ExitInstance () 函数,准备退出。

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

5 )进行应用程序的收尾工作,比如删除注册 的窗口类等。 6 )返回。 3 、从 WinMain() 函数返回后,删除应用程序的唯一应用类

的对象,删除时要调用其析构函数。 4 、终止应用程序。

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

五、程序框架中各个类对象的相互调用关系

1 、视图类对象对文档类对象的调用 例: CDrawDoc *pDoc=GetDocumen( );

GetDocument() 的作用是得到指向文档对象的指针。 2 、在框架类对象中获得当前的文档和视图对象指针 例 :CDrawDoc* pDoc=(CDrawDoc *)GetActiveDocume

nt();

CDrawView* pView=(CDrawView *)GetActiveView( );

3 、获得应用类对象的指针 例 :CDrawApp* pWinApp=(CDrawApp*)AfxGetApp();

4 、从应用类对象中获得主框架类对象的指针 例 :CMainFrame* pFrame=

(CMainFrame*)(AfxGetApp()->m_pMainWnd);

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

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

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

2 、 CPaintDC 类

CPaintDC 类,一般用在函数 OnPaint() 内,以响应 WM_P

AINT消息, WM_PAINT消息是在当窗口的某个区域需要重画时激发的当 CPaintDC 类的对象,接收到WM_PAINT

消息时,自动调用固定的绘制函数,完成客户区的重画。

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

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

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

二、绘图对象类

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

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

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;

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

画笔画线的线形,如下所示:序号 名称 线形 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 个像素时才能使用。

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

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

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

(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));

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

影线画刷(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));

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

影线画刷种类 序号 名称 填充模式 0 HS_HORIZONTAL

1 HS_VERTICAL

2 HS_FDIAGONAL

3 HS_BDIAGONAL

4 HS_CROSS

5 HS_DIAGCROSS

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

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

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

( 4 ) CRgn 类

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

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

常用的创建函数:

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);

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

CRect类

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

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

CPoint 类

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

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

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);相类似。

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

(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);

// 绘制多边形区域,并用画刷填充。

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

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

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

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

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

例: 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");

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