《第五章 MFC(C++教程PPT课件)》由会员分享,可在线阅读,更多相关《第五章 MFC(C++教程PPT课件)(70页珍藏版)》请在金锄头文库上搜索。
1、本章主要学习内容: 5.1Windows的编程机制(API) 5.2MFC的基本原理和使用方法: 5.2.1MFC概述(对应教材的第五章) 5.2.2MFC应用程序框架 5.2.3MFC消息管理 5.2.4MFC宏 5.3常用的MFC类,5.1 Windows编程机制(API),Windows是一个多进程的图形窗口操作系统,Windows应用程序与DOS应用程序有很大的区别。DOS应用程序采用顺序执行过程,而Windows是一个基于事件的消息(Message)驱动系统。 Windows应用程序是按照“事件消息处理”非顺序的机制运行。当有某个事件(如单击鼠标、键盘输入和执行菜单命令等)发生时,W
2、indows会根据具体的事件产生对应的消息,并发送到指定应用程序的消息队列;应用程序从消息队列中取出消息,并根据不同的消息进行不同的处理。,Windows API(Application Programming Interface)是Windows操作系统与应用程序之间的标准接口,它提供了上千个标准函数、宏和数据结构的定义。 在使用Visual C+、Visual Basic和Delphi编程时都可以调用Windows API函数,Windows应用程序可通过调用标准Windows API函数使用系统提供的功能。 Windows API函数定义在一些DLL动态链接库中,其中最主要的DLL是Us
3、er32.dll、Gdi32.dll和Kernel32.dll三个库文件。,5.1.1 关于API和SDK,传统SDK编程:程序员通过调用API函数,自己动手、按部就班地实现程序各部分的功能。SDK应用程序的结构比较清晰,但程序员必须编写所有的功能代码。 利用Visual C+编写一个类SDK应用程序:首先利用Win32 Application向导建立一个Windows应用程序框架,然后根据需要可以向程序项目中添加一些头文件、实现源文件和资源文件,并编写具体的程序代码。,例 编写一个名为Hello的类SDK应用程序,当单击鼠标时通过调用API函数,以弹出一个提示信息对话框。,1执行“File|
4、New”菜单命令,在New对话框的Project页面中选择Win32 Application项目类型,输入程序名Hello。在向导第1步选择“A typital “Hello world!” application”项,单击Finish按钮。 2在窗口函数WndProc()的消息处理分支switch-case结构中添加WM_LBUTTONDOWN鼠标单击消息及其处理代码: case WM_LBUTTONDOWN: MessageBox(NULL, You pressed the left button of mouse !,Message,NULL); break;,SDK应用程序结构:,一个
5、由API函数构造的Windows程序的功能由三个部分组成:入口函数、窗口函数和Windows系统。 每一个程序都有一个主函数,WinMain()函数就是Windows程序的入口主函数。该函数的主要任务是完成一些初始化工作并维护一个消息循环。当消息循环结束后,就退出了WinMain()函数,也就退出了应用程序。此外,WinMain()函数还负责完成窗口的注册、创建和显示。 Windows程序以窗口的形式存在,在不同窗口之间传递消息是Windows和应用程序进行交流的主要形式。程序具体功能由不同的窗口函数实现。,5.1.2 句柄,在Windows中,用句柄(Handle)标识应用程序中不同的对象和
6、同类对象中不同的实例,如一个具体的窗口、按钮、输出设备、画笔和文件等。通过句柄可以获得相应的对象信息。常用的句柄类型有: HWND 、 HINSTANCE 、 HDC 、HCURSOR、HICON、HMENU等。 句柄常作为Windows消息和API函数的参数,在采用API方法编写Windows应用程序时要经常使用句柄。而采用MFC方法编写Windows应用程序时,由于对应的MFC类已对句柄进行了封装,大多数情况下不再需要访问句柄。,获取MFC类对象的句柄的两种方法:,通过访问类的public属性成员变量,如类CWnd的成员变量m_hWnd就是一个窗口对象的句柄。 先定义一个句柄,然后调用MF
7、C类的成员函数Attach()将句柄与一个MFC类对象联系在一起,此时的句柄就成为该MFC类对象的句柄。在退出对象作用域之前,调用成员函数Detach()将句柄和对象进行分离。如下所示: CWnd myWnd; HWND hWnd; myWnd.Attach(hWnd); . . . . . . myWnd.Detach();,所谓消息就是用于描述某个事件发生的信息,而事件是对于Windows的某种操作。 事件和消息密切相关,事件是因,消息是果,事件产生消息,消息对应事件。所谓消息的响应,其实质就是事件的响应。 消息驱动是Windows应用程序的核心,所有的外部响应(如键盘、鼠标和计时器等)都
8、被Windows先拦截,转换成消息后再发送到应用程序中的目标对象,应用程序根据消息的具体内容进行处理。 消息不仅可由Windows发出,它也可由应用程序本身或其它程序产生。Windows为每一个应用程序都维护一个或多个消息队列,发送到每个程序窗口的消息都排成一个队列。,5.1.3 事件和消息,Windows消息分为三种类型:,标准Windows消息:以WM_前缀(但不包括WM_COMMAND)开始的消息,包括鼠标消息、键盘消息和窗口消息,如WM_MOVE 、WM_PAINT等。 控件通知(Control Notification)消息:对控件操作引起的消息,是控件和子窗口向其父窗口发出的WM_
9、COMMAND通知消息。例如,当用户修改了编辑控件中的文本后,编辑控件向其父窗口发送WM_COMMAND通知消息。 命令(Command)消息:由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND消息。命令消息与其它消息不同,它可被更广泛的的对象如文档、文档模板、应用程序对象、窗口和视图等处理。,typedef struct tagMSG HWND hWnd; / 目标窗口句柄 UINT message;/ 消息标识 WPARAM wParam;/ 消息参数1(附加信息,16位) LPARAM lParam;/ 消息参数2(附加信息,32位) DWORD time;/ 消息发送
10、时间 POINT pt; / 消息发送时鼠标的屏幕坐标 MSG;,消息用MSG结构表示:,例 为程序Hello添加键盘消息处理功能,判断当前按下的键是不是A或a键,并给出相应的提示。,打开程序项目Hello,在文件Hello.cpp的窗口函数WndProc()的switch消息处理分支中添加键盘消息的处理代码: case WM_KEYDOWN: / 处理键盘消息 if(wParam=0 x41) / A或a键的虚键码为0 x41H MessageBox(NULL, The key you pressed is A or a !,KEYDOWN,NULL); else MessageBox(NU
11、LL, The key you pressed is not A or a !,KEYDOWN,NULL); break;,利用Windows API开发程序的用户有这样的体会,即使开发一个简单的Windows应用程序也需要对Windows的编程原理有很深刻的认识,需要手工编写冗长的代码。由于程序的出错率是随着代码长度的增加呈几何级数增长的,而且当程序长度逐渐膨胀时,调试程序会变得越来越困难。因此,传统的Windows应用程序设计需要程序员有极大的耐心和丰富的编程经验。 Visual C+捆绑了微软的基础类MFC,编程时我们就可以利用类的可重用性和可扩充性,大大降低Windows应用程序设计的
12、难度和工作量。,5.2MFC的基本原理和使用方法,5.2节要点,5.2.1MFC类(对应教材的第五章全部内容) 5.2.2MFC应用程序框架 5.2.3MFC消息管理 5.2.4MFC宏,一、 MFC概述(教材5.1节),类库是一个可以在应用程序中使用的相互关联的C+类的集合。 MFC作为一个Windows编程类库,它包含了200多个类,封装了Windows的大部分编程对象以及与它们有关的操作。 虽然程序在功能上千差万别,但从本质上看,都可以分为用户界面设计、文件操作、数据库访问及多媒体使用等几部分,这些都可以通过一些类来实现。MFC提供了一个标准化的程序结构,使开发人员不必从头设计一个Win
13、dows应用程序。 MFC实际上是一个庞大的文件库,它由几百个执行文件和源代码文件(如H文件)组成。,5.2.1MFC类(对应教材的第五章全部内容),在Microsoft推出Windows3.0之后,Windows操作系统受到越来越多的人的青睐。因此当时学习Windows程序设计便成为程序员的显学。但是不久,开发人员发现撰写Windows应用程序是重复、厌烦的过程,而且效率极低。因为每一个窗口都需要在窗口函数中处理大量的消息,导致出现大量的重复代码。 随着C+语言的盛行,开发人员发现利用C+语言的特性来封装Windows API和Windows应用程序的开发可以明显地提高程序的开发效率。于是,
14、人们对这种新的开发模式有了强烈的需求。在这种情况下,Microsoft和其他一些大的厂商开始从事Windows框架的设计。于是,MFC就是在这种背景下诞生了。 MFC英文全称是Microsoft Fundation Class Library,即微软基础类库。从其产生至今已经发展了十几个版本,表5-1显示的MFC的发展过程。,MFC中的类按照功能的不同,可以分为不同的层次。图5-1显示了MFC中的所有类及类层次。,二、 MFC类库层次(教材5.2节),MFC中的数据类型与Windows SDK开发包中的数据类型多数是一致的。但也有一些数据类型是MFC独有的。表5-2列出了MFC中使用的数据类型
15、。,其中,表格中列出的最后两个数据类型是MFC所特有的。,三、 MFC常用数据类型(教材5.3节),在MFC类库中,除了提供实现各种功能的类外,还提供了许多全局函数。如下所示: 1MFC诊断函数 为了调试的方便,MFC提供了多个诊断函数,如表5-3所示。,四、 MFC全局函数(教材5.4节),MFC全局函数,2异常抛出函数 为了使程序更具有健壮性,MFC提供了多个异常抛出函数,如表5-4所示。,MFC全局函数,3字符串格式和消息框函数 MFC除了提供CString类操作字符串外,还提供了两个全局函数,如表5-5所示。,4应用程序信息和管理函数 MFC提供与应用程序有关的全局函数如表5-6所示。
16、其中,有许多函数在开发应用程序过程中经常使用。,MFC全局函数,MFC全局函数,5集合类帮助函数 集合类帮助函数多用于数组操作,表5-7列出了MFC提供的集合类帮助函数。,6记录字段交换函数 记录字段交换函数用于记录集数据与变量的交互。表5-8列出了与记录字段相关的函数。,MFC全局函数,MFC全局函数,7OLE相关函数 为了支持OLE技术,MFC对OLE进行了封装,同时提供了一些全局函数用于OLE操作,如表5-9所示。,MFC全局函数,8Internet URL解析全局函数 为了获得URL字符串相关信息,MFC提供了两个全局函数,如表5-10所示。,特点: 1)全局函数 2)都是以名为Afx开头的函数 那是历史遗留下的原因: long,long ago,MFC不叫MFC(在MFC1.0以前),MS开发过一个失败的产品Afx,据说是Application Framework的意思, (x是为了读起来响亮一点(微软就喜欢这样)