1、第 6 章 MFC基础-2-本章目标 了解MFC的类体系 了解MFC应用程序类型 熟悉MFC应用程序开发方法 熟悉MFC的全局函数 熟悉MFC的框架结构 熟悉MFC的消息映射和消息分类 掌握MFC应用程序向导的使用 熟悉MFC子控件的使用 掌握MFC的CString类、文件类的使用 熟悉动态数组类、链表类的使用 掌握MFC的常用绘图操作 熟悉MFC中与绘图有关的数据类型的使用MFC概述MFC简介 MFC(Microsoft Foundation Class Library)是微软基础类库的简称 MFC类库以层次结构组织起来,其中封装了大部分Windows API函数和Windows控件 MFC
2、目的就是让程序员在MFC基础上来建立Windows下的应用程序-3-MFC概述一个简单的MFC程序#include /包含MFC头文件/从MFC的主框架窗体派生用户窗体类class CMyWnd:public CFrameWndpublic:CMyWnd(LPCTSTR szTitle)/调用父类的Create函数创建窗体Create(NULL,szTitle);/从MFC的应用程序派生用户程序类class CMyApp:public CWinApppublic:virtual BOOL InitInstance();/覆盖(改写)继承的应用程序初始化虚函数BOOL CMyApp:InitIn
3、stance()/创建窗体并保存到m_pMainWnd中m_pMainWnd=new CMyWnd(_T(一个简单的MFC程序);m_pMainWnd-ShowWindow(m_nCmdShow);return TRUE;/定义用户程序全局对象CMyApp myApp;-4-MFC概述MFC应用程序分析 无WinMain()函数 应用程序对象:必须利用应用程序类实例化一个全局对象 InitInstance()函数:派生类中重写,用于初始化应用程序 MFC窗体:利用MFC已有的窗体类派生或实例化-5-MFC概述MFC应用程序开发方法-6-MFC应用程序框架全局函数函数原型函数原型说明说明AfxM
4、essageBox()显示一个Windows消息框AfxGetApp()返回当前应用程序对象的指针AfxGetMainWnd()获得程序主窗口的指针AfxBeginThread()创建一个新线程并执行它AfxEndThread()终止当前正在执行的线程AfxFormatString()格式化字符串AfxGetInstanceHandle()返回标示当前应用程序对象的句柄AfxRegisterWndClass()注册用于创建Windows窗口的窗口类-7-MFC应用程序框架类体系-8-MFC应用程序框架消息映射 进行MFC消息处理,需要为每一个要处理的消息提供一个消息处理函数 MFC框架会自动按
5、照一套消息映射机制来调用相应的消息处理函数。MFC消息映射采用C语言宏的方式,把消息和消息处理函数一一对应起来。在MFC的框架结构下,可以进行消息处理的类的头文件(或类定义文件)里面都会含有DECLARE_MESSAGE_MAP()宏-9-MFC应用程序框架消息映射 源程序中的消息映射区:BEGIN_MESSAGE_MAP(CInheritClass,CBaseClass)ON_MESSAGE(message1,meberFxn1)ON_MESSAGE(message2,meberFxn2).END_MESSAGE_MAP-10-MFC应用程序框架消息映射 普通窗口消息窗口消息窗口消息消息映射
6、宏消息映射宏默认处理函数默认处理函数WM_CHARON_WM_CHARafx_msg void OnChar(UINT,UINT,UINT);WM_CLOSEON_M_CLOSEafx_msg void OnClose();WM_CREATEON_WM_CREATEafx_msg int OnCreate(LPCREATESTRUCT);WM_LBUTTONDOWNON_WM_LBUTTONDOWNafx_msg void OnLButtonDown(UINT,CPoint);WM_MOUSEMOVEON_WM_MOUSEMOVEafx_msg void OnMouseMove(UINT,CP
7、oint);-11-MFC应用程序框架消息映射 命令消息/命令消息使用ON_COMMAND宏对其进行映射响应,格式如下:ON_COMMAND(命令ID,响应函数)/响应函数的原型如下:afx_msg void memberFxn();/举例如下:ON_COMMAND(IDM_FILENEW,OnFileNew)/“新建”菜单命令ON_COMMAND(IDM_FILEOPEN,OnFileOpen)/“打开”菜单命令-12-MFC应用程序框架消息映射 控件通知消息/控件消息映射宏的名称一般由三部分组成:ON_控件前缀_消息名(控件ID,响应函数)/举例如下:ON_BN_CLICKED(控件ID,
8、响应函数)ON_CBN_DBCLK(组合框,响应函数)ON_EN_SETFOCUS(组合框,响应函数)ON_LBN_DBCLK(列表框ID,响应函数)-13-MFC应用程序框架应用程序类型 应用程序类型 p 文档/视图程序p 基于对话框的程序-14-MFC主要类根类 根类CObject是MFC的抽象基类,其他MFC类一般都是从CObject直接或间接派生的。CObject类的构造函数不是公有的,因此不能直接使用该类实例化对象。CObject类为程序员提供了许多编程所需的公共操作,包括:对象的建立和删除、串行化支持、对象诊断输出以及运行时信息等。-15-MFC主要类应用程序体系结构类-16-MF
9、C主要类可视对象类 窗口类:CWndMFC的消息映射机制隐藏了CWnd类的窗口函数WndProc()。可以用该类创建普通的窗口 对话框类:CDialog CDialog是对Windows对话框的封装。可以直接使用CDialog类实例化对象然后调用相关成员成员函数以创建对话框 菜单类:CMenuCMenu类是CObject类的子类,它提供了一个面向对象的菜单界面 子控件类子控件类是从CWnd派生的,是MFC对Windows控件的封装,用这些类可以在窗体上建立子控件-17-MFC通用类CString类 CString对象的创建 CString str1;/只创建对象,不赋值CString str2
10、(_T(创建CString对象);/构造对象时,直接赋值CString str3(_T(w);/单字符赋值,字符串包含一个w字符CString str4(_T(A),10);/产生10个”A”的字符串CString str5=str2;/直接字符串赋值,str5的内容从str2复制过来的CString str6(LPCSTR)ID_FILE_NEW);/用字符串资源ID_FILE_NEW的值构造str6-18-MFC通用类CString类 CString常用操作p连接字符串:使用“+”操作符将一个CString字符串与另一个CString字符串或C风格的字符串连接起来;p比较字符串:使用Com
11、apare()成员函数比较两个CString字符串的大小,从第一个字母开始,按照ASCII值比较,如果第一个字母相同,再比较下一个字母,依次往下,直到比较出大小为止;p查找字符串:使用Find()成员函数可以从字符串的指定位置开始查找指定字符或字符串,并返回字符所在字符串中的索引位置;p提取字符串:使用Left()、Mid()和Right()成员函数,可以从一个字符串的左边、中间、右边位置开始提取字符串;p变换字符串:使用MakeUpper()、MakeLower()函数可以变换字符串的大小写。-19-MFC通用类CString类 CString格式化p格式控制字符串的一般形式为:格式控制字符
12、串的一般形式为:标志标志输出最小宽度输出最小宽度精度精度长度长度/使用CString的Format()函数进行格式化的示例代码如下:double f=12356.734;CString str;str.Format(使用指数形式输出:%.3e,f);AfxMessageBox(str);/输出内容是:使用指数形式输出:1.236e+00-20-MFC通用类CFile类 CFile类封装了Windows的文件操作,可以打开/创建文件、读/写文件等。使用CFile类进行文件操作的一般步骤是:p构造构造CFileCFile对象;对象;p打开文件;打开文件;p读读/写文件;写文件;p关闭文件关闭文件
13、-21-MFC通用类动态数组类 MFC的数组类包含CByteArray、CDwordArray、CPtrArray、CUIntArray、CWordArray、CStringArray和CObArray。每一个类都被设计为能够处理一个特定的数据类型。-22-MFC通用类动态数组类主要成员函数函数名称函数名称函数功能函数功能Add在数组的最后添加一个数组元素,在必要时扩展数组Append将另一个数组添加到此数组,在必要时扩展数组Copy将另一数组复制给此数组,在必要时扩展数组SetAtGrow设定数组指定位置处的值,在必要时扩展数组ElementAt获得一个指向数组元素的指针FreeExtra释
14、放不用的数组内存GetAt获取数组内指定位置处的值GetSize获取数组中包含的元素个数GetData获取允许访问数组元素的值的指针GetUpperBound获取数组的上边界的值InsertAt在数组的指定位置插入一个元素,后面的元素下标加1RemoveAt删除指定位置处的值RemoveAll删除数组中的所有元素SetAt设定数组指定位置处的值,数组不增长SetSize设置数组的的初始大小operator 重载数组下标操作符-23-MFC通用类链表类 MFC的链表类包括CPtrList、CStringList、CObList,是分别存储void*、CString、CObject*数据的链表集合
15、。-24-MFC通用类链表类主要成员函数函数名称函数名称函数功能函数功能AddHead在链表的头部添加一个节点,使这个节点称为链表的新的头AddTail在链表的尾部添加一个节点,使这个节点称为链表的新的尾RemoveHead删除链表中第一个元素RemoveTail删除链表中最后一个元素RemoveAt删除指定位置处的节点RemoveAll删除节点中所有的元素GetHead获得链表第一个元素的值GetTail获得链表的最后一个元素的值GetHeadPosition获得链表的头节点的位置GetNext获得指定位置处下一个节点的值GetTailPosition获得链表中尾节点的位置GetPrev获得
16、指定位置上一个节点处的值GetAt获得指定位置处节点处的值SetAt设置指定位置处节点的值GetCount返回链表中元素个数IsEmpty判断链表是否为空InsertBefore在指定位置的前面插入一个节点InsetAfter在指定位置之后插入一个节点Find按照链表顺序搜索给定的对象指针,返回一个POSITION类型的量-25-MFC绘图MFC对GDI的支持 GDI是Windows图形设备接口。MFC对GDI操作进行了进一步的封装,简化了使用方法。MFC类CPaintDC封装了GDI绘图机制。在基于文档/视图结构的应用程序框架中,一般在视图类(CView)的OnDraw()成员函数中处理有关
17、重绘的操作。void TestDemoView:OnDraw(CDC*pDC)CTestDemoDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(!pDoc)return;/进行绘图操作-26-MFC绘图MFC绘图对象 MFC绘图对象类的主要成员函数及功能:对象对象MFC类类创建方法创建方法画笔CPen调用构造函数或CreatePen()和CreatePenIndirect()成员函数画刷CBrush调用构造函数或CreateBrushIndirect()、CreateSolidBrush()等成员函数字体CFont调用CreateFont()、Crea
18、teFontIndirect()等成员函数位图CBitmap一般调用LoadBitmap()函数从资源中加载位图调色板CPalette调用CreatePalette()或CreateHalftonePalette()成员函数区域CRgn调用以Creae开头的成员函数-27-MFC绘图MFC绘图对象 在使用MFC绘图对象时要遵守一定的规则:p创建对象:调用构造函数实例化对象,若构造函数没有创建相应的GDI对象,则要调用成员函数进一步创建;p调用CDC类的SelectObject选入DC;p调用CDC类的成员函数绘图;p恢复原来的对象;p对象离开作用域,自动释放绘图对象,这一步由系统自动实现。-2
19、8-MFC绘图图形绘制相关数据类型 CPoint类:封装了一个点的坐标 CSize类:封装距离以及相对位置 CRect类:用来表示一个矩形-29-小结 MFC提供了一个应用程序框架,简化和标准化了Windows程序设计 MFC应用程序是建立在Windows应用程序机制基础上的 MFC提供了大量的类供程序员继承或直接实例化 MFC比较繁杂,要使用好MFC需要随时查阅MSDN 利用MFC消息映射机制处理消息,程序员要做的就是为每个要处理的消息提供一个消息处理函数 MFC中以Afx开头的函数都是全局函数 MFC将Windows程序分为三类:单文档程序(SDI)、多文档程序(MDI)、基于对话框的程序 MFC通用类提供了许多通用服务,例如字符串处理、文件读写、动态数组、链表 MFC对GDI操作进行了进一步的封装,主要体现在三方面:CDC及其派生类、图形对象类以及与绘图有关的数据类型谢 谢 Thanks for listening.