课后阅读-MFC原理与方法.ppt
《课后阅读-MFC原理与方法.ppt》由会员分享,可在线阅读,更多相关《课后阅读-MFC原理与方法.ppt(56页珍藏版)》请在三一办公上搜索。
1、第 6 章 MFC原理与方法,版权所有 复制必究,一个优秀的编程工具往往匹配一个功能强大的类库,类库封装了大量Windows编程需要使用的函数和数据结构。与Visual C+捆绑在一起的MFC(Microsoft Foundation Class)微软基础类就是这样一个由Microsoft公司设计的类库。采用MFC方式编程提高了Windows应用程序的开发效率,但由于MFC应用程序结构的复杂性和透明性,要想完全掌握MFC应用程序的内部机制需要付出很大的努力。认识MFC只是一个过程、一个手段,最终目的是为了良好并熟练地运用MFC。,本章主要学习内容:Windows的编程机制MFC的基本原理和使用
2、方法:MFC类MFC应用程序框架MFC消息管理MFC宏常用的MFC类,6.1 Windows编程机制,Windows是一个多进程的图形窗口操作系统,Windows应用程序与DOS应用程序有很大的区别。DOS应用程序采用顺序执行过程,而Windows是一个基于事件的消息(Message)驱动系统。Windows应用程序是按照“事件消息处理”非顺序的机制运行。当有某个事件(如单击鼠标、键盘输入和执行菜单命令等)发生时,Windows会根据具体的事件产生对应的消息,并发送到指定应用程序的消息队列;应用程序从消息队列中取出消息,并根据不同的消息进行不同的处理。,Windows API(Applicat
3、ion Programming Interface)是Windows操作系统与应用程序之间的标准接口,它提供了上千个标准函数、宏和数据结构的定义。在使用Visual C+、Visual Basic和Delphi编程时都可以调用Windows API函数,Windows应用程序可通过调用标准Windows API函数使用系统提供的功能。Windows API函数定义在一些DLL动态链接库中,其中最主要的DLL是User32.dll、Gdi32.dll和Kernel32.dll三个库文件。,6.1.1 关于API和SDK,传统SDK编程:程序员通过调用API函数,自己动手、按部就班地实现程序各部分
4、的功能。SDK应用程序的结构比较清晰,但程序员必须编写所有的功能代码。利用Visual C+编写一个类SDK应用程序:首先利用Win32 Application向导建立一个Windows应用程序框架,然后根据需要可以向程序项目中添加一些头文件、实现源文件和资源文件,并编写具体的程序代码。,例 编写一个名为Hello的类SDK应用程序,当单击鼠标时通过调用API函数,以弹出一个提示信息对话框。,1执行“File|New”菜单命令,在New对话框的Project页面中选择Win32 Application项目类型,输入程序名Hello。在向导第1步选择“A typital“Hello world!
5、”application”项,单击Finish按钮。2在窗口函数WndProc()的消息处理分支switch-case结构中添加WM_LBUTTONDOWN鼠标单击消息及其处理代码:case WM_LBUTTONDOWN:MessageBox(NULL,You pressed the left button of mouse!,Message,NULL);break;,SDK应用程序结构:,一个由API函数构造的Windows程序的功能由三个部分组成:入口函数、窗口函数和Windows系统。每一个程序都有一个主函数,WinMain()函数就是Windows程序的入口主函数。该函数的主要任务是完
6、成一些初始化工作并维护一个消息循环。当消息循环结束后,就退出了WinMain()函数,也就退出了应用程序。此外,WinMain()函数还负责完成窗口的注册、创建和显示。Windows程序以窗口的形式存在,在不同窗口之间传递消息是Windows和应用程序进行交流的主要形式。程序具体功能由不同的窗口函数实现。,6.1.2 句柄,在Windows中,用句柄(Handle)标识应用程序中不同的对象和同类对象中不同的实例,如一个具体的窗口、按钮、输出设备、画笔和文件等。通过句柄可以获得相应的对象信息。常用的句柄类型有:HWND、HINSTANCE、HDC、HCURSOR、HICON、HMENU等。句柄常
7、作为Windows消息和API函数的参数,在采用API方法编写Windows应用程序时要经常使用句柄。而采用MFC方法编写Windows应用程序时,由于对应的MFC类已对句柄进行了封装,大多数情况下不再需要访问句柄。,获取MFC类对象的句柄的两种方法:,通过访问类的public属性成员变量,如类CWnd的成员变量m_hWnd就是一个窗口对象的句柄。先定义一个句柄,然后调用MFC类的成员函数Attach()将句柄与一个MFC类对象联系在一起,此时的句柄就成为该MFC类对象的句柄。在退出对象作用域之前,调用成员函数Detach()将句柄和对象进行分离。如下所示:CWnd myWnd;HWND hW
8、nd;myWnd.Attach(hWnd);.myWnd.Detach();,所谓消息就是用于描述某个事件发生的信息,而事件是对于Windows的某种操作。事件和消息密切相关,事件是因,消息是果,事件产生消息,消息对应事件。所谓消息的响应,其实质就是事件的响应。消息驱动是Windows应用程序的核心,所有的外部响应(如键盘、鼠标和计时器等)都被Windows先拦截,转换成消息后再发送到应用程序中的目标对象,应用程序根据消息的具体内容进行处理。消息不仅可由Windows发出,它也可由应用程序本身或其它程序产生。Windows为每一个应用程序都维护一个或多个消息队列,发送到每个程序窗口的消息都排成
9、一个队列。,6.1.3 事件和消息,消息队列和在应用程序中的轮询处理,Windows消息分为三种类型:,标准Windows消息:以WM_前缀(但不包括WM_COMMAND)开始的消息,包括鼠标消息、键盘消息和窗口消息,如WM_MOVE、WM_PAINT等。控件通知(Control Notification)消息:对控件操作引起的消息,是控件和子窗口向其父窗口发出的WM_COMMAND通知消息。例如,当用户修改了编辑控件中的文本后,编辑控件向其父窗口发送WM_COMMAND通知消息。命令(Command)消息:由菜单项、工具栏按钮、快捷键等用户界面对象发出的WM_COMMAND消息。命令消息与其
10、它消息不同,它可被更广泛的的对象如文档、文档模板、应用程序对象、窗口和视图等处理。,typedef struct tagMSG HWND hWnd;/目标窗口句柄 UINT message;/消息标识 WPARAM wParam;/消息参数1(附加信息,16位)LPARAM lParam;/消息参数2(附加信息,32位)DWORD time;/消息发送时间 POINT pt;/消息发送时鼠标的屏幕坐标 MSG;,消息用MSG结构表示:,例 为程序Hello添加键盘消息处理功能,判断当前按下的键是不是A或a键,并给出相应的提示。,打开程序项目Hello,在文件Hello.cpp的窗口函数WndP
11、roc()的switch消息处理分支中添加键盘消息的处理代码:case WM_KEYDOWN:/处理键盘消息 if(wParam=0 x41)/A或a键的虚键码为0 x41HMessageBox(NULL,The key you pressed is A or a!,KEYDOWN,NULL);else MessageBox(NULL,The key you pressed is not A or a!,KEYDOWN,NULL);break;,利用Windows API开发程序的用户有这样的体会,即使开发一个简单的Windows应用程序也需要对Windows的编程原理有很深刻的认识,需要手工
12、编写冗长的代码。由于程序的出错率是随着代码长度的增加呈几何级数增长的,而且当程序长度逐渐膨胀时,调试程序会变得越来越困难。因此,传统的Windows应用程序设计需要程序员有极大的耐心和丰富的编程经验。Visual C+捆绑了微软的基础类MFC,编程时我们就可以利用类的可重用性和可扩充性,大大降低Windows应用程序设计的难度和工作量。,6.2 MFC微软基础类,6.2.1 MFC概述,类库是一个可以在应用程序中使用的相互关联的C+类的集合。MFC作为一个Windows编程类库,它包含了200多个类,封装了Windows的大部分编程对象以及与它们有关的操作。虽然程序在功能上千差万别,但从本质上
13、看,都可以分为用户界面设计、文件操作、数据库访问及多媒体使用等几部分,这些都可以通过一些类来实现。MFC提供了一个标准化的程序结构,使开发人员不必从头设计一个Windows应用程序。MFC实际上是一个庞大的文件库,它由几百个执行文件和源代码文件(如H文件)组成。,使用标准化的程序代码结构,有利于程序员之间的交流。Visual C+为MFC提供了大量的工具支持,提高了编程效率。如利用MFC AppWizard创建MFC应用程序框架,利用ClassWizard方便地对Windows消息进行管理。MFC应用程序的效率较高,只比传统的Windows C程序低5%左右。并且,在MFC应用程序中还允许混合
14、使用传统的Windows API函数。其它优势:完全支持Windows所有的函数、控件、消息、菜单及对话框;具有良好的稳定性和可移植性,更符合微软的风格等。,采用MFC编程的优点:,6.2.2 MFC体系结构,MFC主要组成部分:类、宏和全局函数。类是MFC中最主要的内容。MFC类是以层次结构方式组织起来的。MFC中的类分成两部分,除了一些辅助类,大多数的MFC类是直接或间接从根类CObject派生而来。几乎每一个派生层次都与一具体的Windows实例相对应,如文档类、窗口类和视图类等。MFC宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。MFC约定:全局函数以“Afx”为前缀,
15、全局变量以“afx”为前缀。,首先要对Windows编程概念和API函数有一定的了解,如Windows API有哪些功能和哪些常用的数据结构等。学会抽象地把握问题,不求甚解,不要一开始学习Visual C+就试图了解整个MFC类库。从理解和使用两个方面学习MFC,理解MFC应用程序的框架结构。先大体上了解MFC的概念、组成和基本约定,从简单的类入手,结合程序设计,由浅入深,循序渐进、日积月累。编程时如果MFC某个类能完成所需要的功能,可以直接调用已有类的方法(成员函数)。否则,可以利用面向对象技术中的“继承”方法对MFC类的行为进行扩充和修改,从MFC中已有的类派生出自己需要的类。学习MFC,
16、另一点就是不要过分依赖于向导(Wizard)工具。向导能做许多工作,但同时掩饰了太多的细节。,6.2.3 学习MFC的方法,尽管每个应用程序具体实现的功能不同,但同一类程序的基本结构是相同的。因此,通常采用MFC AppWizard创建一个MFC应用程序框架。MFC不仅仅是一个类库,它还提供了一层建立在MFC类对象封装上的附加应用程序框架。应用程序框架是为了生成一般的应用程序所必需的各种软组件的集成,是类库的一种超集。类库只是一种可以嵌入到任何程序中的、提供某些特定功能的类的集合。而应用程序框架却定制了应用程序的结构和源代码,其中的类对象既相互独立、又相互作用,形成一个统一的整体。,6.3 M
17、FC应用程序框架,MFC应用程序框架提供了构建应用程序所需要的类,在程序运行时能够生成运行时类的对象,如代表应用程序对象、文档对象、视图对象和框架窗口对象。应用程序对象theApp是一个唯一的全局变量,它的主要功能是通过调用WinMain()主函数启动程序的运行。MFC应用程序框架也有一个作为程序入口点的WinMain()主函数,但在源程序中看不见该函数,它在MFC中已定义好并同应用程序相链接。,6.3.1 应用程序框架中的对象,MFC应用程序对象之间的关系,在MFC应用程序的CWinApp派生类对象theApp是一个全局变量,代表了应用程序运行的主线程。它在程序整个运行期间都存在,它的销毁意
18、味着运行程序的消亡。MFC应用程序启动时,首先创建应用程序对象theApp,这时将自动调用应用程序类的构造函数初始化对象theApp,然后由应用程序框架调用MFC提供的AfxWinMain()主函数。AfxWinMain()主函数首先通过调用全局函数AfxGetApp()获取应用程序对象theApp的指针pApp,然后通过pApp调用应用程序对象的有关成员函数,完成程序的初始化和启动工作,最后调用成员函数Run(),进入消息循环。程序运行后将收到WM_PAINT消息,调用OnPaint()函数绘制客户区窗口。如果Run()收到WM_QUIT消息,则结束消息循环,然后调用函数ExitInstan
19、ce(),结束程序运行。,6.3.2 MFC应用程序的生与死,MFC应用程序运行后各函数的调用关系,InitInstance()函数是派生类唯一需要重载的函数,它负责应用程序的初始化,如初始化数据、创建文档模板、处理命令行以及显示应用程序主窗口。,6.3.3 常用的MFC文件和库文件,MFC消息管理是MFC编程的一个重要内容,也是编写MFC应用程序的基础。MFC应用程序消息处理的方式与SDK应用程序有所不同。MFC应用程序框架截取了Windows向应用程序发出的消息,再确定将消息发送给哪一个对象,可以根据需要利用函数重载对消息进行处理,但不需要处理的消息将由应用程序框架自动处理。消息管理包括消
20、息的发送和处理。对于消息发送,MFC提供了类似于API函数功能的消息发送函数,而MFC消息处理的内部机制则相对复杂一些。从编程的角度出发,我们只需了解其大致的原理。,6.4 MFC消息管理,MFC采用消息映射(Message Map)机制取代C/C+语言中的switch-case结构来处理消息。MFC消息映射机制包括一组消息映射宏。一条消息映射宏把一个Windows消息和其消息处理函数联结起来。MFC应用程序框架提供了消息映射功能。在类的实现源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏来定义消息映射。在类定义的结尾用DECLARE_MESSAGE_MA
21、P()宏来声明使用消息映射。,6.4.1 MFC消息映射机制,BEGIN_MESSAGE_MAP(theclass,baseclass)/AFX_MSG_MAP(theclass)ON_./MFC预定义的消息映射宏ON_MESSAGE(message,memberFxn)/用户自定义的消息映射宏./AFX_MSG_MAPEND_MESSAGE_MAP(),MFC应用程序MESSAGE_MAP消息映射形式:,注意:特殊注解“/AFX_MSG_MAP”是ClassWizard类向导用于维护消息映射宏的标记,用户不要删除注解轻易修改注解内的代码。,启动ClassWizard,添加要求的三个消息处理函
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课后 阅读 MFC 原理 方法

链接地址:https://www.31ppt.com/p-6345525.html