400 likes | 622 Views
第六章 基于 MFC 的应用程序框架分析. 一 . 什么是 MFC? 二 . 程序类和文件 三 . 程序框架中各个类的作用分析 四 . 程序的工作步骤分析 五 . 程序框架中各个对象的相互调用关系. 1 、概述
E N D
第六章 基于MFC的应用程序框架分析 一. 什么是MFC? 二. 程序类和文件 三. 程序框架中各个类的作用分析 四. 程序的工作步骤分析 五. 程序框架中各个对象的相互调用关系
1、概述 微软基础类库(MFC:Microsoft Foundation Class)是微软为Windows程序员提供的一个面向对象的Windows编程接口,它大大简化了Windows编程工作。使用MFC类库的好处是:首先,MFC提供了一个标准化的结构,这样开发人员不必从头设计创建和管理一个标准Windows应用程序所需的程序,而是“站在巨人肩膀上”,从一个比较高的起点编程,故节省了大量的时间;其次,它提供了大量的代码,指导用户编程时实现某些技术和功能。 2、MFC类库的概念及组成 (1) 类库是一个可以在应用中使用的相互关联的C++类的集合。 一、什么是MFC?
(2)Microsoft提供了一个基础类库MFC,其中包含用来开发C++和C++ Windows应用程序的一组类。基础类库的核心是以C++形式封装了大部分的Windows API。类库表示窗口、对话框、设备上下文、公共GDI对象如画笔、调色板、控制框和其他标准的Windows部件。这些类提供了一个面向Windows中结构的简单的C++成员函数的接口。 (3)MFC可分为两个主要部分: (1)基础类(2)宏和全程函数。
2、使用MFC生成一个应用程序 - MyDraw 创建新应用程序:
在MFC应用程序中包含着四个主要的类: (1)文档类 (2)视图类 (3)主框架窗口类 (4)应用类 C++类在文件组织上一般分为两部分:头文件(.h)和实现文件(.cpp)。类和结构的定义放在头文件中,通过include宏插入实现文件中。实现文件用来存放类的各种函数的实际实现代码。 二、程序类和文件
由基类CDocument派生,文档类负责存放程序数据并读取磁盘文件数据,或将磁盘文件数据写入磁盘文件中。由基类CDocument派生,文档类负责存放程序数据并读取磁盘文件数据,或将磁盘文件数据写入磁盘文件中。 比如在建立一个图形系统时,存储图形的数据结构等都是放在文档类中的。 1、文档类
视图类是由CView类派生的,它负责显示文档类的数据,可以显示在屏幕上,也可以输出在打印机和其他设备上。在屏幕上,这个类管理客户窗口。视图类是由CView类派生的,它负责显示文档类的数据,可以显示在屏幕上,也可以输出在打印机和其他设备上。在屏幕上,这个类管理客户窗口。 例:在实现一个图形系统时,屏幕上显示、打印机绘图的工作都是由视图类完成的。 2、视图类
单文档的框架类由CFrameWnd类派生的。用来显示一个标题、一个菜单条、窗口的最大化和最小化按钮,边框,工具条以及状态条等。单文档的框架类由CFrameWnd类派生的。用来显示一个标题、一个菜单条、窗口的最大化和最小化按钮,边框,工具条以及状态条等。 多文档应用程序中包含两个框架类:主框架类CMainFrame,由MFC的CMDIFrameWnd类派生,提供了一个多文档界面主窗口的所有功能并管理主窗口中的子窗口,如显示一个标题、菜单条等等;子框架类CChildFrame由CMDIChildWnd派生,用来管理子窗口。子窗口只能在主窗口内显示,而不能在Windows桌面上显示。 3、框架类
应用类是由MFC的CWinApp类派生的。应用类管理程序的总体,它完成初始化、运行程序以及进行最后的程序清除工作。应用类是由MFC的CWinApp类派生的。应用类管理程序的总体,它完成初始化、运行程序以及进行最后的程序清除工作。 4、应用类
举例说明:用文稿、黑板,还有一些工具盒来组成一个工作环境或平台.举例说明:用文稿、黑板,还有一些工具盒来组成一个工作环境或平台. 文档类用来负责文稿的管理工作。 框架类负责黑板的管理工作。 视图类的作用是显示文稿的内容。 应用类负责建立启动这个工作环境。 三、程序框架中各个类的作用分析
运行时,应用程序框架首先获得控制权,依次执行下面的步骤:运行时,应用程序框架首先获得控制权,依次执行下面的步骤: 1、构造唯一的应用类对象theApp,调用CWinApp类的构造函数。 2、调用WinMain()函数。 WinMain()函数的工作又可细分为: 1)获得指向唯一应用类对象的指针。 2)进行一些内部初始化,若失败,转至第5)步。 3)进行应用程序的初始化,即调用InitInstance()函数进行初始化.如果失败,则调用应用类的ExitInstance ()函数,转至5)。 4)调用应用类的Run()函数,其功能主要是 进行消息循环,不断获取消息和处理消息。一直到用户关闭应用程序的窗口,产生WM_QUIT消息,调用ExitInstance ()函数,准备退出。 四、程序的工作步骤分析
5)进行应用程序的收尾工作,比如删除注册 的窗口类等。 6)返回。 3、从WinMain()函数返回后,删除应用程序的唯一应用类的对象,删除时要调用其析构函数。 4、终止应用程序。
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); 五、程序框架中各个类对象的相互调用关系
第七章 与图形操作有关的类及主要操作 一、绘图类简介: 绘图要用到MFC的类包括: CDC类、CPaintDC、CClientDC和CWindowDC等,其中CDC类是基础类。 1、CDC类 在Windows环境下,所有的图形输出都是在设备描述表(Device Context)上进行的.CDC类对设备描述表进行了封装,用来支持对屏幕或打印机所有的图形输出进行任务处理。
2、CPaintDC类 CPaintDC类,一般用在函数OnPaint()内,以响应WM_PAINT消息,WM_PAINT消息是在当窗口的某个区域需要重画时激发的当CPaintDC类的对象,接收到WM_PAINT消息时,自动调用固定的绘制函数,完成客户区的重画。
3、CClientDC类 CClientDC对象只能在客户区域绘图。客户区域不包括边框、标题栏和菜单栏。 如果窗口中有工具栏的话,点(0,0)指的是工具栏下最左边的点。 4、CWindowDC类 CWindowDC类的对象允许用户在显示器的任何地方绘图。包括窗口边框、标题栏等。 注意: 视图窗口没有非客户区域,因此CWindowDC更 适合于框架窗口,而不是视图窗口。
二、绘图对象类 绘图类可以选入绘图对象类来完成图形的 操作,主要绘图对象类有: 类 CGdiObject 类 CPen 类 CBrush 类 CFont 类 CRgn 类 CPalette 类 CBitmap
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;
画笔画线的线形,如下所示: 序号 名称 线形 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个像素时才能使 用。
在绘图对象中选入画笔 void CDrawView::OnDraw(CDC* pDC) { CPen pen (PS_SOLID,1,RGB(255,0,0)); CPen* pOldPen=pDC->SelectObjent(&pen); // 将画笔选入绘图对象 .................//省略画图代码 pDC->SelectObject(pOldPen); //将画笔选出设备环境 }
(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));
影线画刷 (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));
影线画刷种类 序号 名称 填充模式 0 HS_HORIZONTAL 1 HS_VERTICAL 2 HS_FDIAGONAL 3 HS_BDIAGONAL 4 HS_CROSS 5 HS_DIAGCROSS
在绘图对象中选入画刷 void CDrawView::OnDraw(CDC* pDC) { CBrush brush(HS_CROSS,RGB(255,0,0)); //定义并初始化一个画刷实例。 CBrush* pOldBrush=pDC->SelectObject(&brush); //将画刷选入绘图对象 ......................//省略绘图代码 pDC->SelectObject(pOldBrush); //恢复原来的画刷 }
(4)CRgn类 CRgn类封装了Windows图形设备界面区域,区 域可以是椭圆也可以是多边形。 CRgn类的构造函数只有一个,定义一个CRgn类 的对象后,对象不能直接被使用,必须调用一 个创建函数进行初始化以后才能被使用。
常用的创建函数: 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);
CRect类 类CRect与Windows的RECT结构类似,可通过执行它的成员函数来操作RECT结构。 typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT;
CPoint类 类Cpoint起源于Windows的POINT结构,可通过执行它的成员函数来操作POINT结构。 typedef struct tagPOINT { LONG x; LONG y; } POINT; POINT用来指定一个点的x,y坐标。
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); 相类似。
(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); //绘制多边形区域,并用画刷填充。
字体的创建分两步 1)定义一个CFont类的对象。 CFont myFont; 2)调用CFont类的创建字体函数. myFont.CreateFont(...); CreateFont()函数原型如下: BOOL CreateFont(int nHight,//字体高度 int nWidth,//字符平均宽度 int nEscapement//文本行的角度 int nOrientation,//字符的角度 int nWeight,//字符粗细度 BYTE bItalic,//倾斜
BYTE bUnderline,//下划线 BYTE cStrikeOut,//删除线 BYTE nCharSet,//字符集 BYTE nOutPrecision,//字体输出结果和要求 //的匹配程度 BYTE nClipPrecision,//如何剪裁落于剪裁区 //之外的字符。 BYTE nQuiality,//字符属性匹配的精确程度 BYTE nPitchAndFamily,//字体间距和字体族 LPCTSTR lpszFacename//字体名称 );
例: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" );