• 1. 2.5 Visual C++环境及其应用 软件开发一般是在某个操作系统平台之上进行的,平台提供了大量应用工具,这些工具为编程提供了极大的便利,使得编出的应用系统大为丰富。 有使用方便、清新悦目的用户界面; 有计算结果的各种表达:表格、表单、图符、图像、图形、动画,甚至音频、视频等。 程序风格:进行人机界面的设计时,要充分利用平台提供的测试、部署、通信、安装工具加速应用开发,并使开发的应用(程序)系统与各厂商提供的应用软件风格相似。 本节主要介绍VC++程序开发环境。
  • 2. 2.5.1 应用(程序)系统的体系结构一个应用(程序)系统总是由多个程序模块组成。过程式编程是函数/子例程、数据块;面向对象是类、包;基于构件编程是接口类、构件、连接件。为了功能全、少编程,它们往往是共享的,能重用就重用。而且大量重用经过实用考验的模块,应用程序更可靠。 模块的相互联系就形成体系结构(Architecture),就如同一个房子规定了它各个构件的位置,它们共同表现出这个房子的使用性能。一般应用(程序)系统的体系结构如图所示。
  • 3. 图 三层应用体系结构
  • 4. 从逻辑上讲现代应用程序必须有为用户服务的模块,表示交互的用户输入和输出显示、报表软硬拷贝、保存文件、入库、安装等。 第二部分是业务服务模块,即常说的这个(软件)程序该做什么核心计算。 第三部分是数据服务的模块,它是与数据库交互的模块。这里的数据库是广义的,包括文件库。 图中两个应用Application1和Application2共享若干模块,也有为自己开发的模块。在这三层的应用模型中,用户服务、数据服务比较规范。而业务服务一般是要新开发的,当然,可以用到已有的模块。
  • 5. 图形用户界面图形用户界面(GUI)是用户使用终端键盘、鼠标操纵计算机的工作界面,是基于行编辑器的正文界面的后继。 最早在面向对象系统Smalltalk-80(1980)中出现,1984年苹果公司引入超正文(Hypertext)连接技术在Macintosh的操作系统上实现。随着多媒体技术在面向对象系统的推动下大力发展,各个公司都提供了大致相同的图形界面。随着Windows操作系统的出现,微软公司把GUI做成集成开发环境(IDE)的一部分。以面向对象的观点来看待各种计算资源(包括图形用户界面),系统内部以面向对象编程实现。所以,一些面向对象的术语自然成为GUI使用者必备的知识。
  • 6. GUI的诸元素及其实现GUI就是让用户通过鼠标方便地使用各种资源,各种资源以窗口(Window)、图符、图标(icon)、正文的形式展现在屏幕上。 从面向对象的观点来看,GUI中的所有元素均为对象。每类对象均有自己的属性和方法,其中的一些方法是事件。事件是对象与外界的偶发的交互。一旦交互响应了事件,也可能触发另一些事件。
  • 7. 鼠标 鼠标器与光标相对应,鼠标器的移动与光标在屏幕上移动对应。鼠标器上有左键、右键、滚轮,可做的操作是: Point 移光标到某点 Click 单击(表示要使用光标当前位置上的对象) Double-click 双击(使用较大对象或按规定) Drag 拖拽 光标通常有以下四种形状: 一般的 连接的 正忙的 不可用 软件开发商和用户可以自定义光标。 键盘 键盘用于向图形用户界面输入正文信息。键盘利用快捷键、组合键可以操纵光标代替鼠标的工作。
  • 8. 按钮 屏幕上显示出的矩形按钮。它上面一般有文字和图标。按钮对象可以产生一些事件,这些事件一般是由用户通过操作键盘或鼠标来触发的。常用的事件有:LButtonDown(用户在鼠标光标在按钮上时按下了鼠标左键)、KeyDown(当按钮处于可捕获用户输入状态时,用户敲下了键盘上的某键)等。按钮总在某一窗口中,这些事件可以被这个窗口对应的窗口对象捕获。如果窗口对象对这些事件感兴趣,可以“告诉”按钮,并提供响应事件的方法。这些方法是窗口对象的方法,但在事件发生时由按钮调用。 图符与图标 以形象化的微小图形代表某个操作、某个对象、某个子系统、某个项目。和按钮类似,图符和图标也能产生事件,如LButtonDown、DoubleClick(用户移动鼠标光标到其上并双击左键)。图符和图标所在的窗口对应的窗口对象可以响应这些事件,在事件发生时可以执行一些操作。
  • 9. 窗体 窗体是屏幕上的一个矩形区域。为了操作窗体本身,在顶上设有标题(Title)栏,显示窗体名(通常是该窗体代表的程序或程序块名)和类型。标题栏左端是该窗体的控制菜单图标,右端是最大化(还原)、最小化、关闭窗体的按钮(button)。 菜单 菜单是一矩形列表。列出对菜单所属窗体的操作,因此菜单也是方法集。一旦选定某项,菜单对象将调用窗体对象响应这个选中事件的方法,即执行某操作。每个选项又可以有子菜单,子菜单也是对象。当选项后有‘…’时,选定此项则会在屏幕上弹出对话框。 各种框(box) 不同用途的子窗口,根据需要弹出。一般有标题和窗口的关闭按钮。有正文框、检查框、对话框或用户设计的各种功能框。
  • 10. VC++6.0平台界面 启动VC++ 6.0中文版以后,屏幕上显示如图所示的开发环境。开发环境界面由标题栏、菜单栏、工具栏、项目工作区窗口、文档窗口、输出窗口及状态栏组成。每个窗口左上角均有最小化、最大化(还原)和关闭按钮。各类窗口相互独立,可进行打开、关闭、移动、极大、极小化控制以及改变窗口大小。
  • 11. 开发环境界面
  • 12. 标题栏:项目名称及一些功能按钮。 菜单栏:菜单栏包括了开发环境中几乎所有的命令 工具栏:工具栏包括一些菜单栏上的命令,可以更方便快捷地使用
  • 13. 项目工作区窗口 项目工作区窗口包含用户项目的一些信息:类、资源以及文档等。它是VC++开发环境的最主要组成部分,编程的大部分工作都在项目工作区完成。项目工作区用来组织项目、文件和项目信息,它可以处理一个或多个工程所包含的文件及其子工程。 一个项目工作区可以包含由不同的开发软件生成的工程,它以窗口的方式组织项目,文件和项目设置。用户可以双击相关项目打开相应的编辑器进行编辑。如:打开文本编辑器编辑类和源程序;打开对话框编辑器编辑对话框。 项目工作区包含三种视图:类视图,资源视图,文件视图
  • 14. 类窗口类视图资源视图工作区视图
  • 15. (1)类视图(ClassView):该视图显示项目中定义的C++类,VC++可以自动从项目工作区报好的源程序中提取出类。类视图可以察看工程中定义的所有类,以及类的数据成员和成员函数。双击相应的项目可以进入该类的代码编辑。右键单击某个类名或成员选择快捷菜单可以对该类数据成员或成员函数进行浏览、添加、删除等操作。 (2)资源视图(ResourceView):资源视图可以显示项目包含的所有资源文件。在VC++中资源一共有七类:快捷键列表(Accelera tor)、对话框(Dialog)、图标(Icon)、菜单(Menu)、字符串列表(String Table)、工具栏(Toolbar)、版本(Version)。双击相应的资源即可打开相应的资源编辑器进行编辑。 (3)文件视图(FileView):文件视图显示了所创建的工程中所有的文件。使用文件视图可以查看管理工程中的文件。但在文件视图中文件是以其逻辑关系组织起来的。其中VC的主要文件类型有:*.dsw(工作区文件)、*.dsp(项目文件)、*.CLW(含有ClassWizard编辑现有类或增加类的信息文件)、*.h(工程的头文件)、*.ccp(工程的源文件)、*.rc(项目的资源文件)。打开一个工程只需打开该工程的*.dsp文件即可。
  • 16. 文档窗口:文档窗口显示源文件、资源文件、文档文件的程序代码。 输出窗口:输出窗口包括了编译、连接、调试等输出信息。
  • 17. 2.5.2 Windows编程环境构件与控件 编程环境广义上要包括硬件和软件。在这里要讨论的是操作系统之上的与编程有关的软件,如编辑器、编译器、链接器、代码执行器、调试器,直接支持编程的程序包(类库)、图形多媒体包、网络编程接口包等,以及各种支持应用程序开发的工具(如项目管理、各种GUI元素生成、数据交换与共享、线程管理等)。
  • 18. 集成的开发环境(IDE) 一个工具就是一个程序块,加工输入数据和输出结果数据。首先要数据集成,即工具要识别数据类型、格式和存放在什么地方。第二是控制集成。工具是由IDE调用的,因此,它必须有规范的接口,并且各工具有良好的框架才能便于切换和自如地控制。面向对象的对象模型是最好的框架,它封装了数据和操作,更便于管理。当今集成环境都是基于对象或面向对象的。第三是界面集成,这是最重要的。用户在统一界面上可以任意地使用所有的工具(构件块或对象)。
  • 19. Visual Studio和.Net平台 Windows编程环境的核心是Visual Studio。它是Windows操作系统之上的应用开发工具集,也是用不同编程语言开发的用户共享Windows开发资源的平台。 进一步的集成和统一导致了新一代平台诞生。.Net平台以统一的中间代码和公共语言实现了运行时与语言无关的Windows平台上所有资源的完全共享。 本章以VC++ 6.0开发平台介绍VC++程序的开发过程。
  • 20. 2.5.3 Windows环境下的VC++编程VC++是一个在Windows环境下的程序开发工具,它利用面向对象的概念巧妙地屏蔽了Windows环境下程序设计的复杂性,使Windows程序设计变得简单、方便、快捷。VC++基于面行对象与过程的结构化的C++语言和一系列的可视化的窗口设计工具,提供了窗口、菜单、按钮、对话框、消息框、滚动条等Windows程序的标准界面对象,提供了一整套可视化设计工具,使程序设计人员很容易在较短的时间内,设计出十分复杂的窗口界面。
  • 21. (1) VC++程序设计的特点 MFC应用程序 MFC(Microsoft Foundation Class)是由微软编写的一套专门用于Windows编程的基础类库,它的类可以处理许多标准的Windows编程任务。借助AppWizard可以创建非常灵活的应用程序框架,使开发者摆脱那些每次都必写的基本代码。程序员的编程工作仅需要写出功能实现的那部分代码。这样可以大幅度提高程序设计的效率。
  • 22. 基于对象的程序设计思想 和其他的面向对象的程序设计语言(如C++)一样,VC++也允许程序设计人员定义自己的类来对数据进行封装。此外,VC++还支持接口(抽象类),因此,也使VC++程序可具有多态性。 从上面可以看出,VC++的基于对象的程序设计具有灵活、简便、高效的特点。程序设计人员即可以编写自己的类然后实例化成对象,也可以直接使用VC++封装好的对象,即MFC中的对象类。
  • 23. 事件驱动的编程机制 VC++程序中对象与程序的交互是通过事件来实现的。针对每个对象,可能会有多种事件产生,每个事件都能驱动一段程序运行,完成相应的工作。如按钮(Button)是对象,用户用鼠标单击一个按钮(Click)就会产生一个事件,响应此事件的程序代码,放在Button_Click函数中,单击按钮就可得到需要的功能。
  • 24. 方便、易用 VC++是一种高级语言,它具有其他高级语言所具有的优秀特性:结构化的程序设计、接近于人类的语言和逻辑思维方式、语句简单易懂等。此外,VC++还具有支持巨型数组、长字符串、动态数组等优良特性。VC++程序编辑器还支持彩色代码,可用于句法错误检查、判别标识符和断点。VC++还具有功能强大而且灵活的调试器和编译器。
  • 25. 数据库访问功能 VC++系统本身提供了非常好的数据库管理功能,利用数据库管理窗口,用户可直接创建Access数据库,还可直接编辑和访问其他外部数据库,如FoxPro、dBASE、FoxBase等。
  • 26. (2) 消息和事件驱动 上面在介绍VC++语言特点的时候,谈到了消息和事件驱动的概念,下面对这两个概念作一介绍。 Windows应用程序设计的最大特点就是消息处理。所有的Windows应用程序都是基于消息的传递和处理的,每一个Windows程序都要求一个消息循环,应用程序中的每一个窗口都要求有一个消息处理器。不论什么时候,只要出现了一个事件,Windows系统就会产生一条消息。例如用户移动鼠标,Windows系统就产生一条消息告诉相应的应用程序:鼠标已经移动了,移动到了什么地方。因此,Windows应用程序设计的核心就是传送消息、读入消息、处理消息。这种消息机制,就是所谓的事件驱动。
  • 27. 过程和事件驱动的程序流程图
  • 28. 2.5.4 创建V C++应用程序的步骤创建一个VC++应用程序的过程可分为7个步骤: 创建项目 使用Files菜单下的“New”项,会弹出一个New的对话框,选中Projects选项卡,对话框会列出一系列可以创建的项目类型(见图4.),下列出部分常用类型: ATL COM AppWizard(创建ATL应用程序) Custom AppWizard(创建自定义的应用程序) Database Project(创建数据库) DevStudio Add-in Wizard(创建自定义宏) ISAPI Extension Wizard(创建Internet服务器或过滤器) Makefile(创建Make文件) MFC AppWizard(dll)(创建MFC动态链接库) MFC AppWizard(exe)(创建MFC可执行程序) MFC AxtiveX ControlWizard(创建MFC控件程序) Win32 Dynamic Link Library(创建Win32动态链接库) Win32 Application(创建Win32程序) Win32 Console Application(创建Win32控制台程序)
  • 29. Projects选项卡
  • 30. 点选要创建的项目类型,然后在右边的Location框中输入要保存的路径,在Project Name框中输入项目的名字,点击OK,会弹出创建项目向导,可以根据提示选取要创建的项目的细节。最后点Finish按钮。VC++会列出一个将要创建的项目的信息,这时点OK按钮VC++就会自动创建该项目的界面窗口、对话框等的编码文件。项目细节对话框
  • 31. 编制程序 在按需求建立项目之后,应添加资源,设置资源属性,定义类文件,编写函数代码,以及响应事件时所要执行的代码。 编码时可以直接点击项目工作区的相应项目进行编辑。在类视图下可以点击类跳转到源文件相应的行编辑类以及其成员信息。或在资源视图下直接双击相应对象编辑。 保存项目 当创建项目时,VC++会自动生成项目文件。在增加代码时要经常保存项目。保存项目应选File菜单上的Save命令进行保存。有时编码程序时可能会同时改动多个文件这时应注意将改动的文件分别保存或者用File菜单上的Save all命令保存。
  • 32. 建立程序 建立程序包括:编译,链接和运行程序。这行操作可以在快捷栏上用快捷按钮完成。向项目增加代码时,可以建立程序来检查错误和修改代码。 (1)编译(Compile)编译是将单个文件生成*.obj文件供链使用同时以检查程序有无错误。可以单击快捷栏上的编译按钮进行编译。 (2)链接(Build)链接是将程序连接生成*.exe文件,以便直接运行。可以单击快捷栏上的链接按钮进行链接。 (3)执行(Execute)执行是运行工程查看结果。可以单击快捷栏上的执行按钮执行程序。 注意:编译和链接会在文件目录中的Debug目录中生成可执行文件以及与其相关的链接文件。可直接双击该目录下的*.exe文件运行程序。 输出结果显示
  • 33. 创建安装应用程序 因为可执行文件依赖于其他文件,例如与应用程序相关的链接文件*.obj,所以应该使用Setup Wizard创建安装程序,这可以确保将要发布的应用程序拥有运行需要的所有文件。 一个大型应用程序可包括多个窗口,每个窗口均有自己所对应的属性和窗口代码与函数,并且每个窗体自动存于当前项目的项目窗口中。通过打开项目按钮或VB菜单项中Project命令可打开项目窗口,其文件列表框中列出该项目中所有窗体文件。 用建立新模块按钮打开模块代码窗口,编写各模块程序及各种公共变量的声明,模块名称存于相应项目窗口中。每创建一个新的窗体和模块,便在当前项目窗口中产生一个相应的文件。可通过项目窗口中的View Form和View Code切换该项目中各窗体窗口和代码窗口。工具箱中工具的增减可通过对项目窗口中.VBX文件的增加或删除来实现。
  • 34. 34讨论应用程序中对话框的使用 在应用程序中创建和显示一个对话框 掌握对话框中常用控件的使用2.5.5 Visual C++ 应用程序开发对话框和控件
  • 35. 35对话框介绍在Windows操作系统上,大部分用户输入是通过对话框获得的 对话框 是一个由应用程序创建的临时窗口,它可获取用户输入或者显示一条状态信息 对话框的组件称作控件 控件处理用户的输入 应用程序的资源
  • 36. 36对话框介绍(续)例如:在 Visual C++ 中打开一个文件 单击菜单项File,然后在菜单项Open上单击,当我们进行这项操作时,屏幕上的显示如图所示。文件名称文件夹图 1
  • 37. 37对话框介绍(续)为了传递一条信息,可考虑下图所示的对话框 对话框——具有以下特征: 窗口尺寸不能调整 窗口没有菜单 图 2
  • 38. 38对话框介绍(续)通过对话框,一个应用程序和用户进行交流: 要求用户输入 向用户提供信息 两种类型的对话框: 模式对话框 无模式对话框
  • 39. 39模式对话框显示OPEN模式对话框时,发生以下操作: 向它提供一个响应 关闭对话框,即取消打开操作 在没有执行上述两种操作中的任何一个之前不能继续工作 在需要用户提供输入以使应用程序继续时使用
  • 40. 40无模式对话框
  • 41. 41无模式对话框(续)可在对话框和另一篇文档间切换焦点,而不必关闭这个对话框图 4
  • 42. 42无模式对话框(续)显示对话框时,可继续在当前应用程序中的其他位置工作 在用户输入对于应用程序继续当前任务并不完全必要时使用
  • 43. 43CDialog 类封装了一个 Windows 对话框的功能 作为基类,由其派生出所有对话框对象 使用资源文件中的信息创建对话框: 包括模式对话框和无模式对话框 函数有助于操作对话框中的控件
  • 44. 44CDialog 类(续)原型在头文件 afxwin.h 中 考虑创建一个有 OK 和 Cancel 按钮的模式对话框 在RC文件中创建菜单和对话框 这个程序的运行结果是当单击菜单选项时显示一个对话框
  • 45. 45关于对话框的简单程序//The RC File: #include m Menu BEGIN MENUITEM "OPEN",100 END 10 DIALOG 50,80,150,100 STYLE WS_SYSMENU
  • 46. 46关于对话框的简单程序(续)BEGIN CONTROL "OK",IDOK,"BUTTON",BS_DEFPUSHBUTTON,20,50,40,15 CONTROL "CANCEL",IDCANCEL,"BUTTON",BS_PUSHBUTTON, 80,50,40,15 END
  • 47. 47关于对话框的简单程序//The Application #include class MyDialog:public CDialog { public: MyDialog():CDialog(10) { } void OnOK() { MessageBox("Clicked on the OK button", "HELLO"); EndDialog(IDOK); }
  • 48. 48关于对话框的简单程序(续)void OnCancel() { MessageBox("Clicked on the Cancel button", "HELLO"); EndDialog(IDCANCEL); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(MyDialog,CDialog) ON_COMMAND (IDOK,OnOK) ON_COMMAND (IDCANCEL,OnCancel) END_MESSAGE_MAP()
  • 49. 49关于对话框的简单程序(续)class MyFrame:public CFrameWnd { public: MyFrame() { Create(0,"Hello",WS_OVERLAPPEDWINDOW,(CRect)0,0,"m"); } void display() { MyDialog *my; my=new MyDialog; my->DoModal(); } DECLARE_MESSAGE_MAP() };
  • 50. 50关于对话框的简单程序(续)BEGIN_MESSAGE_MAP(MyFrame,CFrameWnd) ON_COMMAND(100,display) END_MESSAGE_MAP() class MyApp:public CWinApp { public: int InitInstance() { MyFrame *b; b=new MyFrame; b->ShowWindow(3); m_pMainWnd=b; return 1; } }; MyApp a;
  • 51. 51对话框简单程序的输出运行这个程序,显示出一个带有菜单选项 OPEN 的窗口如图 5 所示 对话框有 系统菜单 OK 和 Cancel 按钮图 5
  • 52. 52CDialog 类的分级图表CDialog 类的分级图表 ‘mydialog’DoModalCreateCObjectCCmdTargetCWndCDialogmydialog
  • 53. 53CDialog的函数操作对话框中的控件 OnInitDialog() 在创建对话框以及其中的所有控件后,但是正好在对话框出现在屏幕上之前调用 在该函数中实现初始化
  • 54. 54CDialog的函数(续)DoDataExchange() 又称为 DDX 一个可在对话框的控件和变量间传输数据的工具 正好在对话框打开之前 正好在对话框关闭之前 宏和控件用来传输数据: DDX_Text – 编辑控件 DDX_Radio – 单选按钮控件 DDX_Check – 复选框控件 DDX_LBIndex – 列表框控件 从 DoDataExchange 函数内部调用
  • 55. 55CDialog的函数(续)UpdateData( ): 由 OnInitDialog() 调用以便初始化对话框中的控件
  • 56. 56对话框中的控件图 6 所示的对话框中有三个独立元素: 图片 —— 图片控件 文本—— 静态文本控件 按钮——按钮控件 图 6
  • 57. 57对话框中的控件(续)通过在对话框中使用控件,可执行下面的任何操作: 输入文本 选中选项 表明应该执行的操作
  • 58. 58对话框中的控件(续)图 7 图解了 Visual C++ 的控件工具栏 : 图 7
  • 59. 59静态文本控件静态文本控件 显示一个文本、方框、矩形或者一幅位图 不接收任何输入并且不提供任何输出 显示信息 标记其他控件
  • 60. 60CStatic 类的分级图表CObjectCCmdTargetCWndCStaticCStaticCreateGetBitmapSetBitmap
  • 61. 61CStatic 类的成员函数CStatic 类 提供一个静态控件的功能 CStatic(): 用来构造一个 CStatic 对象 Create(): 创建一个 Windows 静态控件 将它附加到 CStatic 对象 GetBitmap(): 获取与 CStatic 对象关联的位图的句柄 SetBitmap(): 将一幅新位图与静态控件关联
  • 62. 62按钮CButton 提供一个按钮控件的功能 复选框,单选按钮和按钮 按钮控件 一个小矩形子窗口,可以单击打开和关闭
  • 63. 63CButton的成员函数CButton(): 构造一个 CButton 对象 Create(): 创建 Windows 按钮控件并将它附加到 CButton 对象 GetCheck(): 获取一个按钮控件的选中状态 SetCheck(): 设置一个按钮控件的选中状态
  • 64. 64禁用OK按钮的代码下面的代码示范在一个应用程序中禁用 OK 按钮 void button() { CButton *b; b=(CButton *)GetDlgItem(IDOK); b->EnableWindow(FALSE) }
  • 65. 65关于单选按钮的简单代码创建一个带有 Male 和 Female 选项的两个单选按钮的对话框 下面的代码选中对话框中的单选按钮 Female,如图 8 所示图 8
  • 66. 66关于单选按钮的简单代码(续)BOOL OnInitDialog() { CButton *male,*female; male=(CButton *) GetDlgItem (IDC_RADIO1); female=(CButton *) GetDlgItem (IDC_RADIO2); female->SetCheck(TRUE); male->SetCheck(FALSE); return TRUE; }
  • 67. 67编辑控件CEdit: 封装 Windows 编辑控件的功能 具有获取和修改显示在编辑框中的文本的函数 编辑控件: 一个矩形子窗口,用户可在其中输入文本
  • 68. 68CEdit 的成员函数Create(): 创建编辑控件,并将它附加到 CEdit 对象 Cut(): 删除编辑控件中的当前选择,并复制被删除的文本到剪贴板 Copy(): 复制编辑控件中的当前选择到剪贴板 Clear(): 清除编辑控件中的当前选择 GetLine(): 从一个编辑控件取回一行文本 并将其放置到缓冲区中。该调用用于处理多行编辑控件
  • 69. 69重要的通知消息ON_EN_CHANGE: 当用户已进行一项可能改变一个编辑控件中文本操作时,消息被发送 原型: ON_EN_CHANGE (ID, Member Function) ON_EN_UPDATE: 当一个编辑控件要显示改变后的文本时,消息被发送。 原型: ON_EN_UPDATE (ID, Member Function)
  • 70. 70重要的通知消息(续)ON_EN_SETFOCUS: 当一个编辑控件接收输入数据时,发送此消息。 原型: ON_EN_SETFOCUS(ID, Member Function) ON_EN_KILLFOCUS: 当一个编辑控件丢失输入焦点时,消息被发送。 原型: ON_EN_KILLFOCUS(ID, Member Function)
  • 71. 71重要的通知消息(续)CEdit 类支持如下的 ES_MULTILINE 样式: Create(ES_MULTILINE|WS_BORDER, rectDefault, this, 200)
  • 72. 72有关编辑控件的代码这个代码示例解释了编辑控件工作,及按钮启用或禁用。 //RC file 10 Dialog 10,100,150,100 BEGIN CONTROL “OK”,IDOK,”BUTTON”,WS_DISABLED|BS_PUSHBUTTON,20,20,30,20 CONTROL “”,201,”EDIT”,WS_BORDER,70,20,40,20 END
  • 73. 73有关编辑控件的代码(续)//Application Class mydialog:public CDialog { void edit() { CButton* b; char s[21]; b=(CButton*)GetDlgItem(IDOK); i=GetDlgItemText(201,s,20); if(i==0) b->EnableWindow(false); else b->EnableWindow(true); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(mydialog,CDialog) ON_EN_CHANGE(201,edit) END_MESSAGE_MAP()
  • 74. 74列表框CListBox 具有处理列表框控件所需的函数 提供函数: 选中一个选项,向列表中添加以及从该列表中获取用户的选择 列表框 一个包括文本字符串列表的控件,用户可从中选择
  • 75. 75CListBox 的成员函数CListBox(): 构造一个 CListBox 对象 Create(): 创建 Windows 的列表框 将它附加到 CListBox 对象中 GetCount(): 返回在一个列表框中的字符串数 AddString(): 添加一个字符串到一个列表框中
  • 76. 76CListBox的分级图表CObjectCCmdTargetCWndCListBoxCListBoxCreateGetCountAddString
  • 77. 77有关列表框的简单代码以下代码将一个文本添加到列表框中图 9
  • 78. 78有关列表框的简单代码(续)BOOL OnInitDialog() { CListBox *list; list=(CListBox *)GetDlgItem(IDC_LIST1); list->AddString ("Lion"); list->AddString ("Leopard"); list->AddString ("Tiger"); list->AddString ("Snake"); list->AddString("Crocodile"); return TRUE; }
  • 79. 79有关列表框的简单代码(续)void OnOK() { CListBox *list; char s[10]; int i; list=(CListBox *)GetDlgItem(IDC_LIST1); i=list->GetCurSel(); list->GetText(i,s); MessageBox(s,"Wild Animals"); EndDialog(TRUE); }
  • 80. 80有关列表框的代码输出在一个消息框中显示用户选定的文本图 10
  • 81. 81组合框控件CCombobox 具有处理组合框控件所必需的函数 提供函数 选中选项、向列表添加以及从列表获取用户选择的函数 组合框 一个列表框控件和编辑框控件的组合
  • 82. 82组合框控件(续)组合框三种类型: 简单式 下拉组合 下拉列表
  • 83. 83关于组合框的示例程序下面代码使用GetLBText()函数将文本添加到列表框中并在消息框中显示已选定的文本 BOOL OnInitDialog() { CComboBox *comb; comb=(CComboBox*) GetDlgItem(IDC_COMBO1); comb->AddString ("Lion"); comb->AddString ("Leopard"); comb->AddString ("Tiger"); comb->AddString ("Snake"); comb->AddString("Crocodile"); return TRUE; }
  • 84. 84关于组合框的示例程序(续)void OnOK() { CComboBox *comb; char s[10]; int i; comb=(CComboBox*) GetDlgItem(IDC_COMBO1); i=comb->GetCurSel(); comb->GetLBText(i,s); MessageBox(s,"Wild Animals"); EndDialog(TRUE); }
  • 85. 85组合框程序的输出运行程序的过程中,显示以下屏幕:图 11
  • 86. 86组合框程序的输出当单击 OK 按钮时,显示出消息框如下:图 12
  • 87. 87使用所有控件的代码以下代码说明了所有控件的用法 #include #include "resource.h" class mydialog:public CDialog { public: char s[10],name[10],check[15],str[500],stat[10]; mydialog():CDialog(IDD_DIALOG1) {} BOOL OnInitDialog() { CListBox* l; l=(CListBox*)GetDlgItem(IDC_LIST1); l->AddString ("America"); l->AddString("London"); l->AddString("Belgium"); l->AddString("Stockholm"); l->AddString("Geneva"); return 1; }
  • 88. 88使用所有控件的代码(续) void OnOK() { CListBox* l; int i; int j; l=(CListBox*)GetDlgItem(IDC_LIST1); i=l->GetCurSel(); l->GetText(i,s); i=GetCheckedRadioButton(IDC_PERM,IDC_TEMP); if(i==IDC_PERM) strcpy(stat,"Permanent");
  • 89. 89使用所有控件的代码(续)else if(i==IDC_TEMP) strcpy(stat,"Temporary"); GetDlgItemText(IDC_EDIT1,name,10); CButton* b; b=(CButton*)GetDlgItem(IDC_STATUS); j=b->GetCheck(); if(j==1) strcpy(check,"Married"); else strcpy(check,"Unmarried"); sprintf(str,"%s who is %s wishes to go to %s on a %s basis",name,check,s,stat); MessageBox(str,"Hello"); EndDialog(1); } DECLARE_MESSAGE_MAP() };
  • 90. 90使用所有控件的代码(续)BEGIN_MESSAGE_MAP(mydialog,CDialog) ON_BN_CLICKED(IDOK,OnOK) END_MESSAGE_MAP() class frame:public CFrameWnd { public: frame() { Create(0,"Hello",WS_OVERLAPPEDWINDOW,rectDefault,0,MAKEINTRESOURCE(IDR_MENU1)); }
  • 91. 91使用所有控件的代码(续)void display() { CClientDC d(this); mydialog *my; my=new mydialog; my->DoModal(); } DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(frame,CFrameWnd) ON_COMMAND(ID_DISPLAY,display) END_MESSAGE_MAP()
  • 92. 92使用所有控件的代码(续)class app:public CWinApp { public: int InitInstance() { frame *f; f=new frame; f->ShowWindow(3); m_pMainWnd=f; return 1; } }; app z;
  • 93. 93(所有控件的显示)程序的输出在运行程序过程中,显示出以下屏幕:图 13
  • 94. 94(所有控件的显示)程序的输出(续)当单击对话框上的 ‘OK’ 按钮时 图 14
  • 95. 95小结对话框是一个由应用程序创建的临时窗口,它可获取用户输入或者显示一条状态信息。  对话框的组件称作控件 MFC 的 CDialog 类封装一个 Windows 对话框的功能 DoModal() 函数用来在屏幕上显示一个对话框 EndDialog 函数可终止并从屏幕上删除对话框 在 OnInitDialog 函数中实现初始化一个对话框中的控件 CStatic 类提供一个静态文本控件的功能 CButton 类提供一个按钮控件的功能 CEdit 类封装处理编辑控件所需的函数 MFC 的 CListBox 类封装处理列表框控件所需的函数
  • 96. 2.5.6 应用程序举例 前面几章,介绍了程序设计语言、程序设计的基础——算法和数据结构、程序设计的方法以及软件工程的概念。本节将使用VC++语言,结合上述的知识,开发一个学生的学习成绩管理系统。VC++是基于对象的编程语言,因此,这里将采用面向对象的开发方法来实现这个系统。
  • 97. (1) 问题的描述目标:设计一个学生的试卷分析系统。学期结束后,一些课程会有考试,任课教师将每个班学生的课程的卷面成绩送到系里,假设教师采用的是统一的数据文件格式。试卷分析系统自动将所有课的卷面成绩数据文件读入,并将成绩存放到对应学生的学生考试成绩表中,当所有学生课程卷面成绩统计完毕后,可以算出该次测试的平均分及成绩分布,并可以绘制成绩分布图,按照要求显示该成绩表,按成绩进行名次排列,查询某个学生的成绩,打印名次排列表,打印需补考的学生姓名。
  • 98. (2) 需求分析拿到项目需求后,首先要做需求分析。需求分析的产品是需求规范文档和用例图。对于这个学生成绩管理系统来说,需求规范文档应该包括:  这是一个学生试卷分析系统;  每个学生有姓名和惟一的学号;  管理员是系统的操作员,他的工作就是和老师或学生打交道并在系统的支持下工作;  系统将老师提供的课程成绩文件导入,生成成绩表。成绩表包括每个学生该门课的成绩。  按分数段统计学生成绩,分为90以上,80-89,70-79,60-69,60以下。 系统可以按分数段绘制成绩分布图 系统可以根据学生的成绩进行名次排列;  系统可以查询有不及格的学生成绩表;  系统有一个友好的图形用户界面(GUI)。
  • 99. 根据需求规范,学生成绩管理系统中的用例有: 1.成绩文件导入 2.名次排序 3.不及格学生成绩查询 对上面的用例进行分析,可以画出用例图。
  • 100. (3) 设计需求分析主要解决一个“做什么”的问题,而设计过程要解决的是“如何做”的问题。设计的目的是指定一个可行的解决方案,以便能很容易地转变成编程代码。 设计可以分为两个阶段:体系结构设计阶段(Architecture Design)和详细设计阶段(Detailed Design)。第一个阶段是从较高层次进行设计,用来定义子系统,描述子系统之间地依赖关系和通信机制。限于篇幅,这里不做介绍。在第二阶段,所有的类都详尽地进行描述,给编写代码的程序员一个清晰的规范说明。这一阶段的最终产物是类图,详细定义了系统中类和它们之间的关系。
  • 101. (本页无文本内容)
  • 102. (4) 界面设计 以上讨论了“学生试卷分析系统”的实现,但还不够。为了使用户更方便、简单地使用“学生试卷分析系统”系统,还要为用户设计良好的用户界面。根据“学生试卷分析系统”的功能及实现要求,可利用Visual C++ 设计一个窗口环境,利用窗口环境自身的特性,通过菜单、对话框、提示框方便用户的操作。 VC++设计是一种基于对象的可视化程序设计语言,VC++程序设计分为界面设计与代码设计两部分,这两部分是相互联系的。在VC++中,每个界面对应一个窗口,一个程序根据实际需要可以有多个界面,因此也就存在多个窗口。 界面设计无需编写任何程序代码,仅需要在窗口中使用工具进行制作即可。界面设计好后,必须为每个对象(窗口中的工具及其控件的总称)设置属性,并对各个对象编写相应的程序代码,以便用户操纵对象时,产生所希望的动作。
  • 103. 对于数据的输入,VC++提供了若干方法:比如通过对话框中的编辑框(Edit Box),命令按钮(Button),单选按钮(Radio Button)列表框(List Box)滑尺(Slider)等控件进行输入。 使用InputBox方法,一次要弹出一个对话框,而且只能输入一个数据,对于前面已输入的数据不能进行修改和查看;而第二种方法呢,则属于交互性输入,便于检查和修改。根据它们的特点,可以用InputBox输入必修课的数目,而用TextBox输入必修课考试成绩的数据文件。下图分别是InputBox与TextBox两种数据输入方法,可以做一对比。为了方便用户进行数据文件名的输入,还提供了驱动器、目录及文件列表。
  • 104. InputBox数据输入方法 TextBox数据输入方法
  • 105. 对于“学生成绩管理系统”的输出,可以直观的列表形式在窗口中给出。图中给出了“学生成绩管理系统”的功能菜单和输出示例。用户可以使用菜单进行操作。输出结果显示
  • 106. (5) 实现前面按照软件工程的步骤一步步进行的:在对需求分析的基础上给出了用例图,然后是设计,给出了类图,最后是界面设计(包括输入界面和输出界面)。这样就把问题完全搞清楚了,就可以坐在计算机面前,正式开始编程序了。 这里按照 “创建VC++应用程序步骤”中介绍的创建VC++应用程序的7个步骤来编写这个程序。
  • 107. 创建用户界面 首先使用文件菜单下的“New”项,创建一个新的MFC可执行程序文件(MFC AppWizard(exe)),并将项目的名称设置为“学生试卷分析系统”。并根据MFC可执行程序创建项目向导的提示创建该项目。 “学生试卷分析系统”有一个主窗口。见图4.16用于结果的输出.两个窗体,窗体一是程序运行后的主窗口,,用于结果的输出;窗体二用于输入数据文件名,见图4.15。窗体一内没有控件对象,窗体二内包含一个将数据输入区包括起来的框架(Frame);一个驱动器列表框(DriveListBox);一个目录列表框(DirListBox);一个文件列表框(FileListBox);七个用于数据输入提示的标签(Lable) ;七个输入文件名显示的文本框(TextBox)以及用于确认输入操作的命令按钮(Command Button)。除了窗体二中的这些对象外,窗体一内还有一个菜单项,菜单项的选项对应实例所提供给用户的功能。 “学生成绩管理系统”中有一个“操作”菜单项,在这个菜单项下有六个选项:“重新操作”、“成绩表显示”、“名次排列”、“不及格名单”、“成绩查询”以及“退出”,其菜单设计窗口见图4.17。
  • 108. “学生成绩管理系统”的菜单设计窗口
  • 109. 设置界面对象的属性 通过上面的步骤,已经创建了一个图4.15和图4.16所示的用户界面的“草图”。它由两个窗体对象、一个框架、七个文本框、七个标签、一个命令按钮、一个驱动器列表、一个目录列表和一个文件列表所组成。每个对象的属性都是VC从环境预先给定的缺省值。为了达到应用程序的具体要求,可通过属性窗口对某些属性作重新设置。下表列出各对象要重新设置值及其缺省值。
  • 110. 表 各对象要重新设置的值及其缺省值对象(Object)属性(Property)缺省(default setting)新设置值(setting)Form1CaptionFORM1学习成绩管理系统Form2CaptionFORM2打开文件对话框Frame1CaptionFrame2必修课数据文件Lable1CaptionLable1所选文件1…………Lable7CaptionLable7所选文件7Text1(0)TextText1空…………Command1CaptionCommand1确认返回Drive1、Dir1、File1缺省缺省缺省
  • 111. 创建用户界面时用到了多个控件。通过这些控件,用户可以同系统进行交互。用户可输入数据,告诉系统做什么,系统将结果在控件中显示出来。使用控件来构造用户界面,就是应用系统三层体系结构中的用户服务层。
  • 112. 编写事件代码 每一个应用程序都有完成它的任务所需的代码。像其他程序设计语言一样,在“学生成绩管理系统”中,有多个对象。对于命令按钮,主要处理其单击事件(Click);文本框中处理其输入焦点改变事件(GetFocus);文件列表框处理其单击事件(Click)。窗体一中对象的处理放在Form1.frm代码中,窗体二中的对象的处理放在Form2.frm中。 事件代码是对用户操作的响应,可能对应着系统的一项功能的执行。功能的执行需要应用系统三层体系结构(见图4.1)中的业务服务层的支持。业务服务层是由许多业务对象来实现的。业务对象的模型就是设计阶段的提交物——类图。业务对象功能的实现可以使用多个现成的构件或函数库,或者业务对象的功能可直接由一个构件提供。这样可以大大提高编程的效率。通常的情况都会使用到大量的构件,构件之间可通过接口结合在一起,这里是在用构件来构造系统的业务层。
  • 113. 小 结本章介绍如何使用VC构造应用系统。 在本章的开始介绍了应用系统的三层体系结构,这使开发应用系统时对程序的结构能有清晰概念。随后介绍了图形用户界面,它对应着应用系统三层体系结构中的用户服务层,是现代的应用系统不可缺少的。 Windows操作系统不仅方便用户使用,还提供了大量的软件来支持程序员在其上开发应用系统。这些软件可分为三类,在4.3节都有介绍。其中构件和控件是面向对象编程思想出现后,编程概念的重要突破。构件和控件的出现使程序员在开发应用系统时可以大量重用已有的成果。大量的重用构件和控件,使得程序员是在构造应用系统,而不用从头到尾地编码来实现系统。使用控件,程序员可以构造用户界面,也就是应用系统的用户服务层;使用构件,程序员可以构造业务服务层和数据服务层。 为方便开发应用系统,将操作系统支持编程的工具(第一类软件)集成起来,统一管理和使用,就形成集成开发环境IDE。这些工具的集成包括了三个方面:数据集成、控制集成和界面集成。VC就是一种集成开发环境。