1、可视可视化编化编程入程入门门mfcmfc本课程简要介绍本课程简要介绍Windows应用程序的形式和在应用程序的形式和在VC+集成开发环境下使用集成开发环境下使用MFC编写编写Windows应用程序的基本应用程序的基本方法,以使同学们对面向对象的可视化(方法,以使同学们对面向对象的可视化(Visual)程序设)程序设计建立一个初步的概念并掌握一些基本方法,为深入学习计建立一个初步的概念并掌握一些基本方法,为深入学习和使用和使用VC+和其他可视化编程工具打下基础。和其他可视化编程工具打下基础。2主题主题可视化编程概述可视化编程概述使用使用MFCMFC进行可视化编程进行可视化编程常用控件及其应用常用
2、控件及其应用菜单设计菜单设计31可视化编程概述可视化编程概述 可视化编程的基本特点可视化编程的基本特点 可视化编程方法可视化编程方法 窗口窗口41.1可视化编程的基本特点可视化编程的基本特点 可视化(可视化(Visual)编程有三个基本特点:)编程有三个基本特点:可视化的图形用户界面设计可视化的图形用户界面设计使用面向对象方法编程使用面向对象方法编程采用事件驱动的程序运行方式采用事件驱动的程序运行方式 51.可视化的图形用户界面设计可视化的图形用户界面设计我们已经相当熟悉以下小程序:我们已经相当熟悉以下小程序:【例【例1.1】#includeusingnamespacestd;intmain(
3、)coutVC+是功能强大的编程工具!是功能强大的编程工具!endl;coutVC+是面向对象的编程工具!是面向对象的编程工具!endl;coutVC+是可视化的编程工具!是可视化的编程工具!endl;return0;6【例【例1.2】#includeusingnamespacestd;intmain()doubler;cout”请输入圆半径:请输入圆半径:”r;cout”圆周长圆周长”2*3.1416*rendl;cout”圆面积圆面积”3.1416*r*rendl;return0;这是基于控制台的文本用户界面应用程序。运行这种程序之这是基于控制台的文本用户界面应用程序。运行这种程序之后,屏
4、幕出现后,屏幕出现MS-DOS窗口,并且按照程序代码的流程执行,窗口,并且按照程序代码的流程执行,用户输入数据后即显示执行结果。用户输入数据后即显示执行结果。78进进行行可可视视化化编编程程,同同样样可可以以写写出出相相同同功功能能的的程程序序,程程序序运运行行出出现现如如图图1和和图图2所所示示的的窗窗口口。图图1中中的的窗窗口口称称为为文文档档窗窗口口,图图2中中的的窗窗口口称称为为对对话话框框。显显然然,它它们们比比MS-DOS的的文本用户界面更为友好且方便。这种界面称为文本用户界面更为友好且方便。这种界面称为图图形形用用户户界界面面(GUI,Graphical UserInterfac
5、e)。)。在非可视化环境下,图形用户界面的设计在非可视化环境下,图形用户界面的设计都需通过编写程序代码来实现,且在设计都需通过编写程序代码来实现,且在设计过程中是看不到界面的实际显示效果的。过程中是看不到界面的实际显示效果的。9VisualStudio支持可视化的图形用户界面设计。支持可视化的图形用户界面设计。Windows应用程序的每个图形界面元素(如对话框、菜应用程序的每个图形界面元素(如对话框、菜单、命令按钮、文本框等)都是单、命令按钮、文本框等)都是可视的可视的,即设计时即设计时在显示器屏幕上是可见的,且所见即所得在显示器屏幕上是可见的,且所见即所得。编程者可根据具体用户界面设计的要求
6、,编程者可根据具体用户界面设计的要求,直接使用直接使用VS系统提供的标准工具在屏幕上系统提供的标准工具在屏幕上“画画”出各种出各种Windows风格的图形界面元风格的图形界面元素,而不必为这些界面元素的构建设计大素,而不必为这些界面元素的构建设计大量代码,量代码,VS会自动生成这些界面元素的设会自动生成这些界面元素的设计代码,开发人员只需为每个图形界面元计代码,开发人员只需为每个图形界面元素设置特定的属性值,代码编写只针对素设置特定的属性值,代码编写只针对界面元素所要实现的具体功能。界面元素所要实现的具体功能。102.面向对象编程方式面向对象编程方式由于由于Windows应用程序的复杂性,从图
7、形用户界面到整个应用程序的复杂性,从图形用户界面到整个应用程序,都是采用面向对象的方法组织的。应用程序,都是采用面向对象的方法组织的。Windows中中的的对象对象可以是所有的规范部件,如窗口、菜可以是所有的规范部件,如窗口、菜单、工具栏、按钮、文本框、以及程序模块单、工具栏、按钮、文本框、以及程序模块等等。从用户的观点看,从用户的观点看,Windows应用程序有一个应用程序有一个窗口,窗口上有若干菜单、命令按钮、图标窗口,窗口上有若干菜单、命令按钮、图标等界面图形元素;等界面图形元素;而窗口背后是一些对应的程序。而窗口背后是一些对应的程序。从从MFC的面向对象模型看,一个的面向对象模型看,一
8、个Windows应应用程序可以拆分成许多功能独立的对象,各用程序可以拆分成许多功能独立的对象,各自负责不同类型的工作,其最基本的构成对象可以分为两大自负责不同类型的工作,其最基本的构成对象可以分为两大类:类:程序对象程序对象和和窗口对象窗口对象。11一个应用程序的执行就像一场舞台演出。应用程序对象是一个应用程序的执行就像一场舞台演出。应用程序对象是幕后人员(导演、剧务等),它们负责安排并指挥幕后人员(导演、剧务等),它们负责安排并指挥“演员演员”(窗口)上场,准备和调度各种演出(窗口)上场,准备和调度各种演出“资源资源”(如菜单、(如菜单、工具栏、图标等)。从操作系统来看,具有工具栏、图标等)
9、。从操作系统来看,具有“法人法人”地位地位的是应用程序对象而非窗口对象,应用程序可以占有的是应用程序对象而非窗口对象,应用程序可以占有CPU时间和内存空间,还可拥有演出所需的时间和内存空间,还可拥有演出所需的“资源资源”。VisualStudio系统给每个对象分配一个系统给每个对象分配一个句句柄柄(handle),),它是一个它是一个4 4字节长的整数值,字节长的整数值,是对象的唯一内部编号是对象的唯一内部编号。应用程序通过句柄。应用程序通过句柄访问相应的对象。每个对象除了句柄外,还访问相应的对象。每个对象除了句柄外,还有一个对象标识符有一个对象标识符ID,可看作是对象的外可看作是对象的外部名
10、。部名。ID与句柄的区别主要在于:与句柄的区别主要在于:ID可以是可以是用户自行设定的;而句柄是系统内定的,对用户自行设定的;而句柄是系统内定的,对用户是透明的,这能防止应用程序直接访问用户是透明的,这能防止应用程序直接访问对象的内部信息。对象的内部信息。123.事件驱动的程序运行机制事件驱动的程序运行机制 传统的文字用户界面的应用程序都有一个起点和终点,程传统的文字用户界面的应用程序都有一个起点和终点,程序中的各模块(函数或对象)的控制过程和执行顺序是在序中的各模块(函数或对象)的控制过程和执行顺序是在编写程序时精心设置好的,是预知的、确定的,整个程序编写程序时精心设置好的,是预知的、确定的
11、,整个程序的运行过程是明确的。这种程序运行机制称为过程驱动。的运行过程是明确的。这种程序运行机制称为过程驱动。可视化应用程序则采用的是事件驱动的程序运行机制:可视化应用程序则采用的是事件驱动的程序运行机制:事件发出消息,消息激活对象。事件发出消息,消息激活对象。即应用程序的运行没有严格的起点和终点以及固即应用程序的运行没有严格的起点和终点以及固定的流程,各对象之间没有规定的执行顺序,定的流程,各对象之间没有规定的执行顺序,即程序的运行过程是不明确的,而是由事件即程序的运行过程是不明确的,而是由事件及其消息控制着对象的激活和程序的运行过程。及其消息控制着对象的激活和程序的运行过程。对象通常处于循
12、环休眠状态,当发生了某个事件并有相应对象通常处于循环休眠状态,当发生了某个事件并有相应消息传递给对象,才会按照消息的指示执行程序代码,一消息传递给对象,才会按照消息的指示执行程序代码,一次消息的处理工作完毕后又恢复休眠状态以等待下一个事次消息的处理工作完毕后又恢复休眠状态以等待下一个事件的发生及其消息的到来。件的发生及其消息的到来。13事件事件(event)是什么?事件的含义很广泛,)是什么?事件的含义很广泛,简单地说,简单地说,事件就是激活对象执行程序代码的事件就是激活对象执行程序代码的一种动作一种动作。在在Windows的操作环境中,无论系统产生的动作还是运行程的操作环境中,无论系统产生的
13、动作还是运行程序时用户产生的动作都称为事件。最常见的用户事件是鼠标序时用户产生的动作都称为事件。最常见的用户事件是鼠标事件和键盘事件。实际上,任何一个拥有设备驱动程序的系事件和键盘事件。实际上,任何一个拥有设备驱动程序的系统输入设备(包括端口)都可以产生各种事件,发送自己的统输入设备(包括端口)都可以产生各种事件,发送自己的消息。消息。消息消息(message)是)是VisualStudio定定义(义(WinUser.h头文件)的头文件)的一种特殊的数一种特殊的数据结构(据结构(MSG),它打包了),它打包了“事件事件”发发生的相关信息生的相关信息,例如:消息接收者的句柄、,例如:消息接收者的
14、句柄、事件的类型和来源、消息参数等。事件的类型和来源、消息参数等。14Windows系统有各种各样的消息,消息的传递无时不在发系统有各种各样的消息,消息的传递无时不在发生,即使电脑闲置时,还会有系统时间的消息传递出来。任生,即使电脑闲置时,还会有系统时间的消息传递出来。任何一个看似十分简单的动作都会引发窗口之间许多消息的交何一个看似十分简单的动作都会引发窗口之间许多消息的交换。在换。在VisualC+中,中,什么对象可以产生或接收什么事件,是由什么对象可以产生或接收什么事件,是由MFC规定的规定的。例如,命令按钮有鼠标单击(例如,命令按钮有鼠标单击(BN_CLICKED)和双击)和双击(BN_
15、DOUBLECLICKED)事件;)事件;文本编辑框有改变文本(文本编辑框有改变文本(EN_CHANGE)、接受输入焦点(、接受输入焦点(EN_SETFOCUS)、)、失去输入焦点(失去输入焦点(EN_KILLFOCUS)、)、单击垂直滚动条(单击垂直滚动条(EN_VSCROLL)等事件。)等事件。15当当在在对对象象上上发发生生了了某某个个事事件件并并发发出出了了相相应应的的消消息息后后,接接收收者者对对象象就就要要响响应应并并处处理理该该消消息息。每每个个需需要要响响应应的的消消息息要要求求对对应应一一个个处处理理该该消消息息的的程程序序事事件件驱驱动动程程序序。响响应应消消息息就就是是启
16、启动动相相应应的的事事件件驱驱动动程程序序。VisualStudio中中将将响响应应消消息息的的过过程程称称为为消消息映射息映射。161.2可视化编程方法可视化编程方法 使用使用VC+进行可视化编程有两种方法:进行可视化编程有两种方法:基于基于WindowsAPI函数的编程方法函数的编程方法基于基于MicrosoftMFC的编程方法的编程方法 171.基于基于WindowsAPI函数的编程方法函数的编程方法 API是应用程序编程接口(是应用程序编程接口(ApplicationProgrammingInterface)的缩写,是)的缩写,是Windows操作系统与操作系统与Windows应用程序
17、之间的标准接口。应用程序之间的标准接口。作为作为Windows操作系统的组成部分(操作系统的组成部分(shell),),API提供了提供了1000多个可供应用程序直接调用的多个可供应用程序直接调用的C函函数(在数(在WindowsAPI参考手册中有详细介绍),参考手册中有详细介绍),这些函数大致可分为三类:这些函数大致可分为三类:窗口管理函数窗口管理函数:实现窗口的创建、移动和修改功能。:实现窗口的创建、移动和修改功能。图形设备接口函数图形设备接口函数:实现与具体显示设备无关的图形操:实现与具体显示设备无关的图形操作。作。系统服务函数系统服务函数:实现操作系统提供的各种实用服务功能。:实现操作
18、系统提供的各种实用服务功能。18使用使用API设计设计Windows应用程序,对于理解和掌握面应用程序,对于理解和掌握面向对象程序设计的思想和方法是相当关键的,是想成为向对象程序设计的思想和方法是相当关键的,是想成为Windows编程高手的必经之路。但它要求编程者必须熟编程高手的必经之路。但它要求编程者必须熟知知Windows应用程序的架构、事件驱动以及消息传递等应用程序的架构、事件驱动以及消息传递等内部机制,并且仍然必须编写大量代码,即它要求编程者内部机制,并且仍然必须编写大量代码,即它要求编程者具备较高的专业素质,这对初学者来说无疑是比较困难的。具备较高的专业素质,这对初学者来说无疑是比较
19、困难的。当然,使用当然,使用API编程更具灵活性和个性化。编程更具灵活性和个性化。API支持所有支持所有Windows应用程序的开发系统,应用程序的开发系统,如如VC+、VB、Java等。等。192.基于基于Microsoft MFC的编程方法的编程方法 MFC是是微软基础类库微软基础类库(MicrosoftFoundationClass)的缩写。与)的缩写。与API不同,不同,MFC不是不是Windows操作系统的组成部分,操作系统的组成部分,而是微软公司专为而是微软公司专为VC+开发的配套软件包。开发的配套软件包。与与VC6配套的是配套的是MFC6.0。MFC充分使用了面向对象方法中的继承
20、和多态性技术,以充分使用了面向对象方法中的继承和多态性技术,以类的方式封装了类的方式封装了Windows应用程序所涉及的几应用程序所涉及的几乎所有的标准部件,如乎所有的标准部件,如Windows应用程序的应用程序的架构、各种标准的图形界面元素、其核心是架构、各种标准的图形界面元素、其核心是它以它以C+的形式封装了的形式封装了WindowsAPI的大部分函数。的大部分函数。20MFC是一个很大的类层次体系(是一个很大的类层次体系(MFC6.0中包含了中包含了200多个多个类),它由一个称为类),它由一个称为CObject的类作为根基类,其他的类作为根基类,其他类大部分从该类派生而来,其整个类体系
21、可大致划类大部分从该类派生而来,其整个类体系可大致划分为:分为:基类基类应用程序框架类应用程序框架类。包括:应用程序类、命令类、文档包括:应用程序类、命令类、文档/视窗类、框架窗口类、文档模板类等视窗类、框架窗口类、文档模板类等可视对象类可视对象类。包括:窗口类、对话框类、控件类等包括:窗口类、对话框类、控件类等绘图类绘图类。包括:绘图工具类、设备描述表类等。包括:绘图工具类、设备描述表类等。简单数据类型类简单数据类型类通用类通用类包括:数组类、类表类、映像类包括:数组类、类表类、映像类文件和数据库类文件和数据库类包括:文件包括:文件I/OI/O类、类、ODBCODBC类、类、ADOADO类类
22、Internet和网络工作类和网络工作类包括:包括:Win32 InternetWin32 Internet类、类、Windows SocketWindows Socket类等类等对象链接和嵌入对象链接和嵌入(OLE,ObjectLingkingandEmbedding)类类调试和异常类调试和异常类21事实上,事实上,MFC封装了一个封装了一个Windows应用程序操作的每一方应用程序操作的每一方面,因此使用面,因此使用MFC编程,编程者可以把注意力集中于自己程序编程,编程者可以把注意力集中于自己程序所特有的部分,不需要事事亲自动手。与直接调用所特有的部分,不需要事事亲自动手。与直接调用API
23、函数相函数相比,这将大大减少编程者编写的代码数量,使编程工作变得更比,这将大大减少编程者编写的代码数量,使编程工作变得更容易;同时,程序标准部分由容易;同时,程序标准部分由MFC的类来提供,可使程序变得的类来提供,可使程序变得更规范,更具可读性,效率也更高。更规范,更具可读性,效率也更高。对编程新手来说,对编程新手来说,MFC的最大优点是它以高效简洁的方式的最大优点是它以高效简洁的方式为编程者做了所有标准部分的工作,特别是编程者可以在不需为编程者做了所有标准部分的工作,特别是编程者可以在不需要写一行代码的情况下完成一个完整的应用要写一行代码的情况下完成一个完整的应用程序架构程序架构(约需千行代
24、码)。(约需千行代码)。MFC中包含了成中包含了成千上万行功能强大的、经过优化的千上万行功能强大的、经过优化的Windows程序代码。编程者只要定义了某个程序代码。编程者只要定义了某个MFC类的对象,就可以调用类的对象,就可以调用该类的成员函数,轻轻松松完成本该由你自己一行行编写的程该类的成员函数,轻轻松松完成本该由你自己一行行编写的程序代码。从这点上说,序代码。从这点上说,MFC极大地降低了程序开发难度。极大地降低了程序开发难度。221.3窗窗 口口窗口窗口是是Windows图形用户界面的最基本和图形用户界面的最基本和最重要的部件,每一个最重要的部件,每一个Windows程序至少程序至少有一
25、个窗口。故有一个窗口。故Windows图形用户界面也图形用户界面也称窗口界面。称窗口界面。231.框架窗口框架窗口框架窗口是应用程序的主窗口,负责管理其包容的其框架窗口是应用程序的主窗口,负责管理其包容的其他窗口。一个应用程序的最顶层的框架窗口是应用程序启他窗口。一个应用程序的最顶层的框架窗口是应用程序启动时创建的第一个窗口。动时创建的第一个窗口。MFC提供了由基类提供了由基类CWnd(窗口类)派生的(窗口类)派生的4个框架个框架窗口类:窗口类:CFrameWndCMDIFrameWndCMDIChildWndCdialog用于支持三种标准框架窗口:用于支持三种标准框架窗口:24单文档单文档(
26、Singledocument)窗口)窗口由由CframeWnd类支持。文档窗口主要由边框、标题栏、类支持。文档窗口主要由边框、标题栏、菜单栏、工具栏、编辑区等组成。菜单栏、工具栏、编辑区等组成。多文档多文档(Multipledocuments,MDI)窗)窗口口由多个文档窗口组成,其中第一个打开的是主框架窗口,由多个文档窗口组成,其中第一个打开的是主框架窗口,由由CMDIFrameWnd类支持,其他为子框架窗口,由类支持,其他为子框架窗口,由CMDIChildWnd类支持。子框架窗口没有菜单栏类支持。子框架窗口没有菜单栏和工具栏,它们共享主窗口的菜单栏和工具栏。和工具栏,它们共享主窗口的菜单栏
27、和工具栏。对话框对话框(Dialog)对话框是一种特殊类型的窗口,它没有菜单栏和工具栏,对话框是一种特殊类型的窗口,它没有菜单栏和工具栏,且一般不能改变窗口的大小。对话框由且一般不能改变窗口的大小。对话框由Cdialog类支持。类支持。252.2.对话框与控件对话框与控件 对话框对话框对话框对话框是应用程序用于显示或提示,并且等待用是应用程序用于显示或提示,并且等待用户输入信息的弹出式窗口。户输入信息的弹出式窗口。对对话框的操作一般是对对话框的操作一般是通过在对话框上添加控件来实现的。通过在对话框上添加控件来实现的。对话框与控件对话框与控件密不可分,在每个对话框内都有一些控件,对话框密不可分,
28、在每个对话框内都有一些控件,对话框依靠这些控件与用户交互依靠这些控件与用户交互。可以说,对话框是。可以说,对话框是Windows应用程序中最重要的用户界面元素,是应用程序中最重要的用户界面元素,是应用程序与用户进行交互的主要部件。应用程序与用户进行交互的主要部件。控件控件控件控件VisualStudio把主要设置在对话框上的把主要设置在对话框上的一些标准的图形界面元素定义为一些标准的图形界面元素定义为控件控件(Control),如文本框、列表框、命令按钮、复选框等,如文本框、列表框、命令按钮、复选框等,它们中的大多数可以捕获它们中的大多数可以捕获事件并向对话框发送消息。控件实际上也都是窗口,事
29、件并向对话框发送消息。控件实际上也都是窗口,所有的控件类都是所有的控件类都是CWnd类的派生类。控件通常是作为对话框的子窗口而创建的。类的派生类。控件通常是作为对话框的子窗口而创建的。Over262使用使用MFC进行可视化编程进行可视化编程建立项目架构建立项目架构 设计图形用户界面设计图形用户界面设计对象的事件驱动程序,编写相关代码设计对象的事件驱动程序,编写相关代码 项目的编译、链接和运行项目的编译、链接和运行 27VisualStudio把开发一个应用程序的过程称之为把开发一个应用程序的过程称之为“项目项目”(Project,很多人把它翻译成,很多人把它翻译成“工程工程”)。开发一个)。开
30、发一个Windows应用程序的项目远比开发一个控制台应用程序项目应用程序的项目远比开发一个控制台应用程序项目要复杂得多,工作量也要浩大得多。好在要复杂得多,工作量也要浩大得多。好在VisualStudio提供提供了一组强大的了一组强大的MFC项目的开发工具。项目的开发工具。开发一个开发一个MFC项目通常有四个步骤:项目通常有四个步骤:Step.1建立项目架构建立项目架构Step.2设计图形用户界面设计图形用户界面Step.3设计对象的事件驱动程序设计对象的事件驱动程序Step.4项目的编译、链接和运行项目的编译、链接和运行下面结合一个简单的编程实例(下面结合一个简单的编程实例(Case1)“计
31、算圆的周长和计算圆的周长和面积面积”来介绍这四个步骤。来介绍这四个步骤。282.1建立项目架构建立项目架构建立项目架构(建立项目架构(skeleton),类似于一个项目的总),类似于一个项目的总体设计,它需要确定项目的类型,根据项目类型创建并体设计,它需要确定项目的类型,根据项目类型创建并组织各种基本组件,包括:所有的类、一些基本对象、组织各种基本组件,包括:所有的类、一些基本对象、项目所需的必要资源等。从而为项目搭建起一个完整的项目所需的必要资源等。从而为项目搭建起一个完整的架构。架构。29所谓项目类型,是以项目采用什么框架窗口作为主窗口来所谓项目类型,是以项目采用什么框架窗口作为主窗口来界
32、定的。界定的。MFC支持三种标准项目类型:支持三种标准项目类型:单文档单文档(Singledocument)项目)项目以单文档窗口作为项目主窗口。以单文档窗口作为项目主窗口。多文档多文档(Multipledocuments)项目)项目以多文档窗口作为项目的主窗口。以多文档窗口作为项目的主窗口。对话框对话框(Dialogbased)项目)项目以对话框作为项目主窗口。这是最紧凑、以对话框作为项目主窗口。这是最紧凑、最简单的一种标准项目架构。最简单的一种标准项目架构。30VC+为用户建立项目架构提供了一个强大的工具为用户建立项目架构提供了一个强大的工具MFC AppWizard(MFC应用程序向导)
33、。应用程序向导)。本实例采用的是对话框架构。本实例采用的是对话框架构。31操作步骤操作步骤1.选择选择VC6主窗口菜单栏中的主窗口菜单栏中的“文件新建文件新建”菜单项,弹菜单项,弹出一个如图出一个如图3所示的所示的“新建新建”对话框。对话框。2.在对话框中选择在对话框中选择“项目项目”(project)选项卡。选择)选项卡。选择MFCAppWizardexe(即即MFC应用程序应用程序)项,在对话框右项,在对话框右部输入项目的路径和项目名,然后单击部输入项目的路径和项目名,然后单击“确定确定”按钮。按钮。VC+以文件夹方式管理项目,如图以文件夹方式管理项目,如图3 3所示所示,case1是是D
34、:CPPMFC_PRJ下的一个文件夹,该项目的下的一个文件夹,该项目的各种文件都将存放在这个文件夹中。各种文件都将存放在这个文件夹中。3.在系统弹出如图在系统弹出如图4所示的所示的“MFC应用程序向导步骤应用程序向导步骤1”对话框中进行项目类型选择。先选择单选按钮对话框中进行项目类型选择。先选择单选按钮“Dialogbased”(对话框项目),再单击(对话框项目),再单击“下一个下一个”按钮。按钮。324.依次选择系统弹出的依次选择系统弹出的图图5至图至图7(步骤(步骤2至步骤至步骤4)中对话框)中对话框的选项,用户可以先全部采用默认选择,然后在编程过程中再的选项,用户可以先全部采用默认选择,
35、然后在编程过程中再按需要修改。单击图按需要修改。单击图7中的中的“完成完成”按钮,或者在出现其中任按钮,或者在出现其中任一个对话框时单击一个对话框时单击“完成完成”按钮,表示默认其他选项,系统就按钮,表示默认其他选项,系统就不再弹出其他对话框。不再弹出其他对话框。5.系统弹出如系统弹出如图图8所示的所示的“新建项目信息新建项目信息”对话框,其中列出对话框,其中列出前面所做的选择内容,单击前面所做的选择内容,单击“确定确定”按钮。按钮。至此,项目架构创建完成,系统回到至此,项目架构创建完成,系统回到VC6的的集成开发环境,如集成开发环境,如图图9所示。所示。从该窗口的左窗格的各选项卡中可以观察到
36、从该窗口的左窗格的各选项卡中可以观察到MFCAppWizard为为一个对话框项目的架构创建的所有组件:一个对话框项目的架构创建的所有组件:33CCase1Dlg等三个类等三个类其中最主要的是其中最主要的是CCase1Dlg类(项目类(项目case1的对话框类),的对话框类),它由它由Cdialog类派生。类派生。34case1Dlg.h等四个头文件等四个头文件case1Dlg.h是最主要的一个头文件,它包含了是最主要的一个头文件,它包含了CCase1Dlg类的声明。类的声明。35case1Dlg.cpp等四个等四个C+源程序文件源程序文件case1Dlg.cpp是是CCase1Dlg类的实现,
37、它不仅是最重要类的实现,它不仅是最重要的源程序文件,而且是整个项目的核心。用户的编程工作的源程序文件,而且是整个项目的核心。用户的编程工作主要是在这个文件上完成,它将包含实现具体应用功能的主要是在这个文件上完成,它将包含实现具体应用功能的全部代码。全部代码。case1.cpp是项目的是项目的启动程序,类似于非启动程序,类似于非Windows应用程序中应用程序中的的main函数。函数。36另外,另外,MFCAppWizard为项目生成了一个对话框窗体、为项目生成了一个对话框窗体、一个项目图标、项目版本等资源。一个项目图标、项目版本等资源。37至至此此,虽虽然然一一行行代代码码都都没没有有编编写写
38、,但但这这个个应应用用程程序序架架构构是是可可以以运运行行的的程程序序。进进行行编编译译链链接接后后,其其运运行行结结果果如如图图10所所示。以这种方式建立的应用程序,其主窗口即是对话框。示。以这种方式建立的应用程序,其主窗口即是对话框。图图10.对话框项目架构的运行结果对话框项目架构的运行结果382.2设计图形用户界面设计图形用户界面设计工具与设计方案设计工具与设计方案操作步骤操作步骤391.设计工具和设计方案设计工具和设计方案在完成了对话框项目架构的创建后,在完成了对话框项目架构的创建后,VC6窗口上弹出窗口上弹出了了MFC的对话框编辑器(的对话框编辑器(图图11)。)。对话框编辑器主要用
39、于创建、编辑对话框窗口,向对对话框编辑器主要用于创建、编辑对话框窗口,向对话框窗体上添加控件和调整布局。对话框编辑器主要包括话框窗体上添加控件和调整布局。对话框编辑器主要包括如下组件:对话框窗体、控件箱、调整(布局)工具栏以如下组件:对话框窗体、控件箱、调整(布局)工具栏以及对话框和控件的属性对话框。及对话框和控件的属性对话框。对话框窗体对话框窗体是是MFC给每个工程默认生成的给每个工程默认生成的一一个图形资源,它是个图形资源,它是CCase1Dlg类的图形化。类的图形化。所谓窗体即窗口毛坯,是还未完全成形的初所谓窗体即窗口毛坯,是还未完全成形的初始窗口,它如同一块始窗口,它如同一块“画布画布
40、”,在它上面可以画上各种,在它上面可以画上各种控件来构成项目所需的实际窗口。窗体的标题栏上显示的控件来构成项目所需的实际窗口。窗体的标题栏上显示的是本项目的名字,窗体上可设置网格,用于安排控件的位是本项目的名字,窗体上可设置网格,用于安排控件的位置和大小。在程序运行时,网格会自动消失。置和大小。在程序运行时,网格会自动消失。40控件箱控件箱,MFC设计有设计有20多个标准控件类,多个标准控件类,每个控件类就是制作控件的工具,控件工每个控件类就是制作控件的工具,控件工具箱,简称具箱,简称控件箱控件箱(图(图12)是存放控件类)是存放控件类的容器,这些控件类都以图标式按钮表示。的容器,这些控件类都
41、以图标式按钮表示。开发人员可利用控件箱在对话框上创建各开发人员可利用控件箱在对话框上创建各种所需的控件。种所需的控件。将控件箱中的控件工具复制到对话框窗体中,即在对话框将控件箱中的控件工具复制到对话框窗体中,即在对话框中创建了相应的控件对象中创建了相应的控件对象,这可通过可视化操作实现:,这可通过可视化操作实现:方法方法1:用鼠标按住控件箱上所选中的控件图标,拖到对:用鼠标按住控件箱上所选中的控件图标,拖到对话框中合适的位置。或话框中合适的位置。或方法方法2:先单击控件箱上所选中的控件图标,:先单击控件箱上所选中的控件图标,然后移动鼠标到对话框中合适的位置。然后移动鼠标到对话框中合适的位置。复
42、制到对话框上的控件,可以移动、复制、调整复制到对话框上的控件,可以移动、复制、调整或删除,也可拖动鼠标缩放控件的大小。或删除,也可拖动鼠标缩放控件的大小。41对于本实例,可在对话框上建立如下控件:对于本实例,可在对话框上建立如下控件:1个编辑框个编辑框:用于用户输入半径值;:用于用户输入半径值;5个静态文本框个静态文本框(静态文本框只能显示文本而不能输入文(静态文本框只能显示文本而不能输入文本),其中:本),其中:2个静态文本框分别用于显示圆周长和圆面积,个静态文本框分别用于显示圆周长和圆面积,其余其余3个静态文本框分别用于对上述三个文本框进行文个静态文本框分别用于对上述三个文本框进行文字说明
43、。字说明。2个命令按钮个命令按钮,“确定确定”和和“退出退出”:前者用于前者用于确定输入值,计算圆周长和圆面积,然后把确定输入值,计算圆周长和圆面积,然后把结果显示在对应的输出框上;后者用于结束结果显示在对应的输出框上;后者用于结束程序的执行。程序的执行。效果如效果如图图2。422.2.操作步骤操作步骤(1)设置主窗口的属性值设置主窗口的属性值单击对话框窗体,使其成为当前窗口(周围出现单击对话框窗体,使其成为当前窗口(周围出现8个小方个小方块)。块)。从从VC6窗口的菜单栏上的窗口的菜单栏上的“查看查看”菜单中选择菜单中选择“属性属性”选选项,或者用鼠标右击窗体,从弹出的快捷菜单中选择项,或者
44、用鼠标右击窗体,从弹出的快捷菜单中选择“属性属性”,都将弹出图,都将弹出图13所示的所示的“对话框属性对话框属性”对话框。对话框。在在“常规常规”(General)选项卡下:)选项卡下:该对话框对象的该对话框对象的ID默认为:默认为:IDD_CASE1_DIALOG将标题值设置为:将标题值设置为:计算圆周长和圆面积计算圆周长和圆面积单击单击“字体字体”按钮,进行字体属性的设置按钮,进行字体属性的设置其余属性采用默认值。其余属性采用默认值。关闭属性对话框。关闭属性对话框。上述设置在上述设置在CCase1Dlg类的代码中立即被反映。类的代码中立即被反映。43(2)添加编辑框控件添加编辑框控件用鼠标
45、把控件工具箱上的编辑框拖到对话框窗体的合适用鼠标把控件工具箱上的编辑框拖到对话框窗体的合适位置,就建立了一个编辑框控件。位置,就建立了一个编辑框控件。用鼠标右击该编辑框,从弹出的快捷菜单中选择用鼠标右击该编辑框,从弹出的快捷菜单中选择“属性属性”,弹出如图,弹出如图14所示的所示的编辑框属性对话框编辑框属性对话框。该编辑框对象的该编辑框对象的ID默认为:默认为:IDC_EDIT1在在“样式样式”(Styles)选项卡中设置相关属性值为:)选项卡中设置相关属性值为:“靠靠左左”(Left)和)和“垂直居中垂直居中”(Center)。)。其余属性采用默认值。其余属性采用默认值。关闭属性对话框。关闭
46、属性对话框。44(3)添加静态文本框控件添加静态文本框控件用鼠标把控件工具箱上的静态文本框拖到对话框窗体的合用鼠标把控件工具箱上的静态文本框拖到对话框窗体的合适位置,就建立了一个静态文本框控件。用同样的操作(或适位置,就建立了一个静态文本框控件。用同样的操作(或复制)建立其他四个静态文本框。复制)建立其他四个静态文本框。用鼠标右击静态文本框,从弹出的快捷菜单中选择用鼠标右击静态文本框,从弹出的快捷菜单中选择“属性属性”,弹出如图,弹出如图15所示的所示的静态文本框属性静态文本框属性对话框。对话框。可对这可对这5个静态文本框的属性值设置如下:个静态文本框的属性值设置如下:ID标题其他属性标题其他
47、属性-IDC_STATIC1输入半径输入半径:居中,垂直居中居中,垂直居中IDC_STATIC2圆周长圆周长居中,垂直居中居中,垂直居中IDC_STATIC3圆面积圆面积居中,垂直居中居中,垂直居中IDC_STATIC4默认默认靠左,垂直居中靠左,垂直居中,ClientedgeIDC_STATIC5默认默认靠左,垂直居中靠左,垂直居中,Clientedge其中,其中,IDC_STATIC45作为结果输出框,分别显示圆周长和圆面积;作为结果输出框,分别显示圆周长和圆面积;IDC_STATIC13分别作为输入框和输出框的文字说明。分别作为输入框和输出框的文字说明。45(4)建立命令按钮控件建立命令
48、按钮控件建立建立2个命令按钮,它们的属性值设置如下:个命令按钮,它们的属性值设置如下:ID标题标题-IDC_BUTTON1确定确定IDC_BUTTON2退出退出-至此,控件在窗体上至此,控件在窗体上“摆放摆放”完毕,可以用鼠标完毕,可以用鼠标调整它们的大小和位置,也可以用调整工具调整它们的大小和位置,也可以用调整工具栏调整控件之间的对齐方式、分布、大小规格,以及测试栏调整控件之间的对齐方式、分布、大小规格,以及测试效果,设计好的图形用户界面如效果,设计好的图形用户界面如图图16所示。所示。462.3设计对象的事件驱动程序设计对象的事件驱动程序设计的工作和方法设计的工作和方法设计工具与设计方案设
49、计工具与设计方案操作步骤操作步骤471.设计的工作和方法设计的工作和方法对象的事件驱动程序在对象的事件驱动程序在VC+中称为中称为消息处理成员函数消息处理成员函数。对于对话框工程,作为工程的主界面,对话对于对话框工程,作为工程的主界面,对话框对象需要响应并处理所有的控件消息。设框对象需要响应并处理所有的控件消息。设计对话框的消息处理成员函数的工作主要包计对话框的消息处理成员函数的工作主要包括:括:确定各个控件要传递的数据;确定各个控件要传递的数据;确定对象的消息映射,即接收什么消息,建立确定对象的消息映射,即接收什么消息,建立什么消息处理函数;什么消息处理函数;在消息处理函数的函数体内添加代码
50、。在消息处理函数的函数体内添加代码。48在实际应用中,读取或更新控件上的数据是对话框的非常在实际应用中,读取或更新控件上的数据是对话框的非常重要的工作。重要的工作。MFC为此提供了一套标准方法:为此提供了一套标准方法:DDX(DataExchange,数据交换)和,数据交换)和DDV(DataValidation,数据校验)技术。,数据校验)技术。DDX通过通过成员变量成员变量(membervariable)的方)的方式实现对话框与控件之间的数据传递。式实现对话框与控件之间的数据传递。如如果要在对话框的消息处理函数中访问控件果要在对话框的消息处理函数中访问控件上的数据,就必须先在对话框类上的数