第三章、MFC编程概述

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第三章MFC应用程序概述1第3章MFC应用程序概述精讲MicrosoftWindows是微软公司推出的一个应用于微机上的具有图形用户界面的多任务和多窗口的操作系统。Windows应用程序也称为窗口应用程序,所有的窗口应用程序都有着相同的窗口风格和菜单结构,用户界面友好,方便用户操作。本章从剖析窗口应用程序的基本结构入手,继而介绍使用MFC类库开发的应用程序框架结构,并介绍窗口应用程序运行的核心机制-消息映射。学习了本章,你将对MFC应用程序框架结构和运行机制有个整体的了解,为后面进入窗口应用程序开发打下良好的基础。3.1窗口应用程序概述窗口应用程序的开发一般采用可视化的面向对象的开发,可选择的窗口应用程序开发语言有VisualC++、VisualBasic、VisualJava、Dephi等等。无论采用哪一种开发语言,首先要了解窗口应用程序的基本机制。3.1.1窗口编程基础窗口应用程序运行于Windows操作系统,Windows操作系统是一个多任务操作系统,因此窗口应用程序的组成,支持技术,基本运行机制等与DOS应用程序有着本质的区别。在学习开发窗口应用程序之前,先要对窗口应用程序有一个概念上的了解。1.窗口窗口是应用程序与用户进行交互的界面,应用程序通过窗口传递信息给用户,同样用户通过窗口输入数据,发布命令给应用程序。Windows界面包含了丰富的标准用户界面元素,包括窗口、图标、菜单、滚动条、对话框、控件和消息框等。用户使用这些界面元素可以方便的与应用程序进行交互,一个典型的窗口外观如图3-1所示。垂直滚动条控制菜单栏标题栏菜单栏关闭按钮最小化按钮最大化按钮水平滚动条窗口边界客户区VC++6简明教程2图3-1Windows应用程序窗口组成在Windows编程中,各种窗口、菜单、按钮、对话框及程序模块等Windows的规范部件是按“对象”来组织的。为了提高开发窗口应用程序的效率,微软公司为用户提供了大量能创建上述标准元素的API函数和C++类,并且以WindowsAPI函数库和C++类库的形式提供给用户,以充分满足构成应用程序操作界面的需要。因此,要编写窗口应用程序必须了解这些标准对象的属性及方法,这样程序员的大量工作简化为创建对象和为对象属性赋值。标准对象具有标准的形态及标准的操作方法,并且能够对鼠标或键盘操作产生标准的消息响应。在后面的章节中将会陆续介绍上述窗口界面元素的创建原理和创建方法。一个窗口应用程序可能包含一个或多个窗口,应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。2.消息和消息队列窗口应用程序是利用消息(Message)与其它窗口应用程序和操作系统进行信息交换的。消息的作用是通知一个应用程序某个确定的事件的产生,应用程序会对该事件产生响应,响应的方式已预先在应用程序中定义,即编写了相应的消息处理代码。例如当按下鼠标左键时,系统会产生WM_LBUTTONDOWN消息,并通知应用程序窗口,应用程序接到该消息后,会检查是否已定义消息处理函数并作出响应。Windows操作系统内核基本元件USER为所有的用户界面元素提供支持,它用于接收和管理所有输入消息、系统消息,并把它们发送给相应应用程序的消息队列。消息队列是一个系统定义的内存块,用于临时存储消息,或是把消息直接发给窗口过程。每个应用程序都维护着自己的消息队列,并从中取出消息,利用窗口函数进行处理。如图3-2所示。图3-2消息驱动模型窗口应用程序接受系统队列传递过来的消息的步骤如下:应用程序1窗口函数WndProc消息映射默认窗口函数DefWndowProcApp1消息队列App2消息队列App3消息队列系统队列输入消息系统消息postMessageSendMessage3(1)每个窗口应用程序都有一个WinMain()函数,在该函数中会定义一个窗口句柄,当窗口应用程序启动时,会使用窗口句柄注册,操作系统使用窗口句柄与窗口应用程序通信。(2)窗口应用程序创建一个或多个窗口,每一个窗口都有一个窗口处理函数(WndProc),负责窗口显示和响应用户输入。(3)消息映射(MessageLoop)负责从消息队列中取消息,并送回窗口,由窗口处理函数选择合适的消息处理函数响应消息。若窗口处理函数中没有给出该消息的处理代码,将由DefWindowProc函数进行默认处理。消息机制是窗口应用程序运行的核心工作机制,消息往往用一个如下的结构体MSG来表示,其定义如下:typedefstructtagMSG{HWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;}MSG;其中结构成员说明如下:(1)hwnd该消息所在的窗口句柄,若此参数为null,则可检索所有驻留在消息队列中的消息。(2)message消息值,每个Windows消息都有一个消息值,该值由Windows.h头文件中的宏定义来标识。(3)wParam和lParam包含有关消息的附加信息,它随消息的不同而不同。(4)time指定消息送至队列的时间。(5)pt指定消息发送时屏幕光标的位置,其数据类型POINT也是一个结构体,其定义如下:typedefstructtagPOINT{LONGx;LONGy;}POINT;Windows应用程序的消息来源有以下4种:(1)输入消息由键盘和鼠标操作产生输入消息。这一类消息首先放在系统消息队列中,然后由Windows操作系统将它们送入应用程序消息队列中,由应用程序来处理消息。(2)控件消息用户操作窗口的控件对象时产生控件消息,例如当用户在列表框中改动当前选择或改变了复选框的状态时就会发出控件消息。这类消息一般不进入应用程序消息队列,而是直接发送到控件对象所属的对话框窗口。VC++6简明教程4(3)系统消息对程序化的事件或系统时钟中断做出反映。一些系统消息,象DDE消息(动态数据交换消息)要通过Windows的系统消息队列,而另一些系统消息则不通过系统消息队列,而直接送入应用程序的消息队列,如创建窗口消息。(4)用户消息这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。3.事件驱动的程序设计Windows操作系统下的窗口应用程序采用事件驱动的程序设计,与DOS操作系统下的面向过程的程序设计有着明显的不同。在DOS操作系统下,用户在DOS提示符后输入一行命令及参数,启动应用程序并按程序指定运行。一个程序是一系列预先定义好的操作序列的集合。程序直接控制程序事件和过程的顺序,并按照某种不可改变的模式进行工作。在窗口应用程序下,用户首先启动应用程序,然后窗口等待用户通过对图形界面上的元素的操作,传递信息和命令,如选择一个菜单项或者单击一个按钮。窗口应用程序不是按事先安排好的顺序来执行的,而是由事件的发生来控制逻辑。事件的发生是随机的、不确定的,这样就允许用户按各种合理的顺序来安排程序的流程。例如,有这样一个简单的应用程序,程序的功能是计算体操全能比赛项目运动成绩管理,体操全能包括四个项目。在一个过程驱动的程序中,要按照如下步骤完成应用程序功能的实现。(1)输入第一项运动员的成绩。(2)输入第二项运动员的成绩。(3)输入第三项运动员的成绩。(4)输入第四项运动员的成绩。(5)计算每个运动员的总分。(6)按总分排名。在过程驱动的程序中,程序执行的顺序是确定的,如图3-3所示。图3-3过程驱动程序流程示例开始输入第一项运动员的成绩输入第二项运动员的成绩输入第三项运动员的成绩输入第四项运动员的成绩计算每个运动员的总分按总分排名结束5在这种过程驱动的程序中,首先按事先安排好的顺序把所有的成绩输入,然后再计算每一个运动员的总分,再进行成绩排名。事件驱动的程序的逻辑顺序是按事件的产生而决定的,事件的产生不是预先定义的,有着随机性。图3-4给出了事件驱动程序的流程示意图。图3-4事件驱动程序流程示例事件驱动的应用程序启动后,每一个事件的发生将在对应的消息队列中放置一条消息,这样基于事件产生的输入没有固定的顺序,用户可以随机选取,以任何合理的顺序来输入数据。程序开始运行时,处于等待用户输入事件状态,然后取得消息并作出相应反应,处理完毕又返回并处于等待事件状态。在这种处理逻辑中,用户可以按需要进入不同的事件处理,例如,可以录入任意一个比赛项目,某位运动员的成绩,而不需要考虑录入顺序,随时计算运动员当前的总分和排名。体操比赛通常是几个项目同时进行,在比赛进行中,可以实时地输入运动员的得分,随时反映每个运动员的当前得分和当前总分排名情况。4.资源管理资源可分为用户自定义资源和系统资源两种。用户自定义资源是指窗口可视元素的映像,即在前面所提及的窗口所包含的标准元素。例如菜单、对话框、工具栏等,是由每一个应用程序各自定义的。系统资源是由系统提供给各个应用程序共享的,常见的系统资源包括:设备上下文,画刷、画笔、字体、通信端口等。由于Windows操作系统是一个多任务的操作系统,多个应用程序要共享系统资源,而不能象DOS程序独占系统的全部资源。系统资源是有限的,窗口应用程序使用资源的模式为:请求资源,使用资源,释放资源。如果系统资源在使用后不能得到及时的释放,会影响其它应用程序使用资源,最终造成死机。系统资源以句柄来标识,使用系统资源要通过WindowsAPI函数来实现安全访问。在窗口程序设计中,用户自定义资源与程序是分开定义的,在DevelopStudio中提供了资源管理器用于用户自定义资源的创建、修改和维护。用户可以使用资源管理器提供的模板来设计资源,保存在资源文件中,资源文件通常以.RC为后缀名。每一个用户自定义资源都有唯一的ID标识,可以用一个自定义的整数或一个名称来表示。资源编译程序最终会将资源编译为应用程序所能读取的对象的二进制映像和具体的数据结构,并存放于应用程序的可执行文件中或动态连接库中,这样减轻了程序设计中定义和管理资源的复杂性。开始输入第一项某运动员的成绩输入第二项某运动员的成绩输入第三项某运动员的成绩输入第四项某运动员的成绩计算每个运动员的总分按总分排名结束消息循环VC++6简明教程63.1.2Windows应用程序组成在这一节中将分析一个简单的Win32窗口应用程序,MFC应用程序是建立在Win32应用程序设计的基础上的,这将帮助更好地理解一个MFC应用程序是如何初始化的,窗口是如何创建的,消息是如何处理的。所有的窗口应用程序必须包含两个基本函数:(1)应用程序主函数WinMain()WinMain函数定义了窗口句柄,创建初始化窗口并启动一个消息循环。(2)窗口处理函数WinProc()WinProc函数处理所有从操作系统传递到窗口的消息。每一个窗口,无论是简单的或复杂的,都要有一个窗口处理函数。【例3-1】创建一个简单的窗口应用程序示例。本例的目的在于说明创建Windows应用程序的方法及过程。(1)在VC集成开发平台,执行菜单“File”下的菜单命令“New”,打开“New”对话框。(2)在“New”对话框中的“Project”标签页中选择“Win32Application”,在右边输入工程名为:Exam3_1,并确定工程文件保存位置,单击“OK”按钮。(3)在随后的向导窗口Win32Application-step1of1中,选择“Anemptyproject”,单击“Finish”按钮。(4)在出现的“NewProjectInformation”对话框中,单击“OK”按钮,完成工程的创建,并回到集成开发平台。(5)再执行菜单“File”下的菜单命令“New”,添加一个新的C源文件(*.cpp),程序名为Exam3_1。(6)按程序清单3-1中的代码实现Exam3_1.cpp文件。(7)编译运行。程序清单3-1:创建一个简单的Windows窗口程序代码//包含应用程序中所需的数据类型和数据结构的定义#includewindows.h//窗口函数说明LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,L

1 / 39
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功