slide1
Download
Skip this Video
Download Presentation
第六章 基于 MFC 的应用程序框架分析

Loading in 2 Seconds...

play fullscreen
1 / 40

第六章 基于 MFC 的应用程序框架分析 - PowerPoint PPT Presentation


  • 183 Views
  • Uploaded on

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

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about ' 第六章 基于 MFC 的应用程序框架分析' - kobe


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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
slide1

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

一. 什么是MFC?

二. 程序类和文件

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

四. 程序的工作步骤分析

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

slide2
1、概述

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

2、MFC类库的概念及组成

(1) 类库是一个可以在应用中使用的相互关联的C++类的集合。

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

(3)MFC可分为两个主要部分:

(1)基础类(2)宏和全程函数。

slide11
在MFC应用程序中包含着四个主要的类:

(1)文档类

(2)视图类

(3)主框架窗口类

(4)应用类

C++类在文件组织上一般分为两部分:头文件(.h)和实现文件(.cpp)。类和结构的定义放在头文件中,通过include宏插入实现文件中。实现文件用来存放类的各种函数的实际实现代码。

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

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

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

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

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

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

3、框架类
slide15
应用类是由MFC的CWinApp类派生的。应用类管理程序的总体,它完成初始化、运行程序以及进行最后的程序清除工作。应用类是由MFC的CWinApp类派生的。应用类管理程序的总体,它完成初始化、运行程序以及进行最后的程序清除工作。 4、应用类
slide16
举例说明:用文稿、黑板,还有一些工具盒来组成一个工作环境或平台.举例说明:用文稿、黑板,还有一些工具盒来组成一个工作环境或平台.

文档类用来负责文稿的管理工作。

框架类负责黑板的管理工作。

视图类的作用是显示文稿的内容。

应用类负责建立启动这个工作环境。

三、程序框架中各个类的作用分析
slide17
运行时,应用程序框架首先获得控制权,依次执行下面的步骤:运行时,应用程序框架首先获得控制权,依次执行下面的步骤:

1、构造唯一的应用类对象theApp,调用CWinApp类的构造函数。

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

1)获得指向唯一应用类对象的指针。

2)进行一些内部初始化,若失败,转至第5)步。

3)进行应用程序的初始化,即调用InitInstance()函数进行初始化.如果失败,则调用应用类的ExitInstance ()函数,转至5)。

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

四、程序的工作步骤分析
slide18
5)进行应用程序的收尾工作,比如删除注册 的窗口类等。

6)返回。

3、从WinMain()函数返回后,删除应用程序的唯一应用类的对象,删除时要调用其析构函数。

4、终止应用程序。

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

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

第七章 与图形操作有关的类及主要操作

一、绘图类简介:

绘图要用到MFC的类包括:

CDC类、CPaintDC、CClientDC和CWindowDC等,其中CDC类是基础类。

1、CDC类

在Windows环境下,所有的图形输出都是在设备描述表(Device Context)上进行的.CDC类对设备描述表进行了封装,用来支持对屏幕或打印机所有的图形输出进行任务处理。

slide21

2、CPaintDC类

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

slide22

3、CClientDC类

CClientDC对象只能在客户区域绘图。客户区域不包括边框、标题栏和菜单栏。

如果窗口中有工具栏的话,点(0,0)指的是工具栏下最左边的点。

4、CWindowDC类

CWindowDC类的对象允许用户在显示器的任何地方绘图。包括窗口边框、标题栏等。

注意:

视图窗口没有非客户区域,因此CWindowDC更

适合于框架窗口,而不是视图窗口。

slide23

二、绘图对象类

绘图类可以选入绘图对象类来完成图形的

操作,主要绘图对象类有:

类 CGdiObject

类 CPen

类 CBrush

类 CFont

类 CRgn

类 CPalette

类 CBitmap

slide24

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;

slide25

画笔画线的线形,如下所示:

序号 名称 线形

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个像素时才能使

用。

slide26

在绘图对象中选入画笔

void CDrawView::OnDraw(CDC* pDC)

{

CPen pen (PS_SOLID,1,RGB(255,0,0));

CPen* pOldPen=pDC->SelectObjent(&pen);

// 将画笔选入绘图对象

.................//省略画图代码

pDC->SelectObject(pOldPen);

//将画笔选出设备环境

}

slide27

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

slide28

影线画刷

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

slide29

影线画刷种类

序号 名称 填充模式

0 HS_HORIZONTAL

1 HS_VERTICAL

2 HS_FDIAGONAL

3 HS_BDIAGONAL

4 HS_CROSS

5 HS_DIAGCROSS

slide30

在绘图对象中选入画刷

void CDrawView::OnDraw(CDC* pDC)

{

CBrush brush(HS_CROSS,RGB(255,0,0));

//定义并初始化一个画刷实例。

CBrush* pOldBrush=pDC->SelectObject(&brush);

//将画刷选入绘图对象

......................//省略绘图代码

pDC->SelectObject(pOldBrush);

//恢复原来的画刷

}

slide31

(4)CRgn类

CRgn类封装了Windows图形设备界面区域,区

域可以是椭圆也可以是多边形。

CRgn类的构造函数只有一个,定义一个CRgn类

的对象后,对象不能直接被使用,必须调用一

个创建函数进行初始化以后才能被使用。

slide32

常用的创建函数:

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

slide33

CRect类

类CRect与Windows的RECT结构类似,可通过执行它的成员函数来操作RECT结构。

typedef struct tagRECT

{   LONG left;  

LONG top;  

LONG right;

  LONG bottom;

} RECT;

slide34

CPoint类

类Cpoint起源于Windows的POINT结构,可通过执行它的成员函数来操作POINT结构。

typedef struct tagPOINT

{   LONG x;  

LONG y;

} POINT;

POINT用来指定一个点的x,y坐标。

slide35

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

相类似。

slide36

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

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

slide37

字体的创建分两步

1)定义一个CFont类的对象。

CFont myFont;

2)调用CFont类的创建字体函数.

myFont.CreateFont(...);

CreateFont()函数原型如下:

BOOL CreateFont(int nHight,//字体高度

int nWidth,//字符平均宽度

int nEscapement//文本行的角度

int nOrientation,//字符的角度

int nWeight,//字符粗细度

BYTE bItalic,//倾斜

slide38

BYTE bUnderline,//下划线

BYTE cStrikeOut,//删除线

BYTE nCharSet,//字符集

BYTE nOutPrecision,//字体输出结果和要求

//的匹配程度

BYTE nClipPrecision,//如何剪裁落于剪裁区

//之外的字符。

BYTE nQuiality,//字符属性匹配的精确程度

BYTE nPitchAndFamily,//字体间距和字体族

LPCTSTR lpszFacename//字体名称

);

slide39

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

);

ad