第一章 VC++的Windows编程入门
《C++程序设计》教材和该课程中的例程都是基于MS-DOS的控制台应用程序。这种程序是在文字用户界面下以命令行方式运行的,其特点是开销小,运行速度快。对于开发特定用途的应用程序以及进行基本程序设计训练,可以说控制台应用程序是合适的选择。
随着Windows操作系统的出现和普及,Windows(窗口式)风格的图形用户界面被人们普遍接受和喜爱,它较之传统的文字用户界面对用户更为友好。Visual C++就提供了编写Windows风格的应用程序的全面支持。
本课程简要介绍Windows应用程序的形式和在VC++集成开发环境下使用MFC编写Windows应用程序的基本方法,以使同学们对面向对象的可视化(Visual)程序设计建立一个初步的概念并掌握一些基本方法,为深入学习和使用VC++和其他可视化编程工具打下基础。 §1 Windows编程概述 1.1 Windows编程的基本特点 Windows编程有三个基本特点:
●可视化的图形用户界面设计 ●使用面向对象方法编程 ●采用事件驱动的程序运行方式 1.可视化的图形用户界面设计
我们已经相当熟悉以下小程序: #include
cout<<”请输入圆半径:”<
cout<<”圆周长=”<<2*3.1416*r < 这是一个基于控制台的文字用户界面应用程序。运行这种程序之后,屏幕出现MS-DOS窗口,并且按照程序代码的流程执行,用户输入数据后即显示执行结果。 进行Windows编程,同样可以写出相同功能的程序,程序运行出现如图1所示的窗口。这个窗口称为对话框,可作为人-机交互的接口,它比MS-DOS的文字用户界面更为友好且方便。这种界面称为图形用户界面(GUI, Graphical User Interface)。 在非可视化环境下,图形用户界面的设计都需通过编写程序代码来实现,且在设计过程中是看不到界面的实际显示效果的。 Visual C++支持可视化的图形用户界面设计。Windows应用程序的每个图形界面元素(如对话框、菜单、命令按钮、文本框等)都是可视的(Visual),即设计时在屏幕上是可见的,且所见即所得,编程者可根据具体用户界面设计的要求,直接使用VC++系统提供的标准工具在屏幕上“画”出各种Windows风格的图形界面元素,而不必为这些界面元素的构建设计大量代码,VC++会自动生成这些界面元素的设计代码,开发人员只需为每个图形界面元素设置特定的属性值,代码编写只针对界面元素所要实现的具体功能。 2. 面向对象编程方式 由于Windows应用程序的复杂性,从图形用户界面到整个应用程序,都是采用面向对象的方法组织的。Windows中的对象可以是所有的规范部件,如窗口、菜单、工具栏、按钮、文本框、以及程序模块等。 从用户的观点看,Windows应用程序有一个窗口,窗口上有若干菜单、命令按钮、图标等界面图形元素;而窗口背后是一些对应的程序。 从MFC的面向对象模型看,一个Windows应用程序可以拆分成许多功能独立的对象,各自负责不同类型的工作,其最基本的构成对象可以分为两大类:程序对象和窗口对象。 一个应用程序的执行就像一场舞台演出。应用程序对象是幕后人员(导演、剧务等),它们负责安排并指挥“演员”(窗口)上场,准备和调度各种演出“资源”(如菜单、工具栏、图标等)。从操作系统来看,具有“法人”地位的是应用程序对象而非窗口对象,应用程序可以占有CPU时间和内存空间,还可拥有演出所需的“资源”。 Windows系统给每个对象分配一个“句柄”(handle),它是一个4字节长的整数值,是对象的唯一内部编号。应用程序通过句柄访问相应的对象。每个对象除了句柄外,还有一个对象标识符ID,可看作是对象的外部名。ID与句柄的区别主要在于:ID可以是 用户自行设定的;而句柄是系统内定的,对用户是透明的,这能防止应用程序直接访问对象的内部信息。 3. 事件驱动的程序运行机制 传统的文字用户界面的应用程序都有一个起点和终点,程序中的各模块(函数或对象)的控制过程和执行顺序是在编写程序时精心设置好的,是预知的、确定的,整个程序的运行过程是明确的。这种程序运行机制称为过程驱动。 Windows应用程序则采用的是事件驱动的程序运行机制: 事件发出消息,消息激活对象。 即应用程序的运行没有严格的起点和终点以及固定的流程,各对象之间没有规定的执行顺序,即程序的运行过程是不明确的,而是由事件及其消息控制着对象的激活和程序的运行过程。对象通常处于循环休眠状态,当发生了某个事件并有相应消息传递给对象,才会按照消息的指示执行程序代码,一次消息的处理工作完毕后又恢复休眠状态以等待下一个事件的发生及其消息的到来。 “事件”(event)是什么?事件的含义很广泛,简单地说,事件就是激活对象执行程序代码的一种动作。在Windows的操作环境中,无论系统产生的动作还是运行程序时用户产生的动作都称为事件。最常见的用户事件是鼠标事件和键盘事件。实际上,任何一个拥有设备驱动程序的系统输入设备(包括端口)都可以产生各种事件,发送自己的消息。 消息(message)是Windows定义(WinUser.h头文件)的一种特殊的数据结构(MSG),它打包了“事件”发生的相关信息,例如:消息接收者的句柄、事件的类型和来源、消息参数等。 Windows系统有各种各样的消息,消息的传递无时不在发生,即使电脑闲置时,还会有系统时间的消息传递出来。任何一个看似十分简单的动作都会引发窗口之间许多消息的交换。 在VC++中,什么对象可以产生或接收什么事件,是由MFC规定的。例如,命令按钮有鼠标单击(BN_CLICKED)和双击(BN_DOUBLECLICKED)事件;文本编辑框有改变文本(EN_CHANGE)、接受输入焦点(EN_SETFOCUS)、失去输入焦点(EN_KILLFOCUS)、单击垂直滚动条(EN_VSCROLL)等事件。 当在对象上发生了某个事件并发出了相应的消息后,接收者对象就要响应并处理该消息。每个需要响应的消息要求对应一个处理该消息的程序——事件驱动程序。响应消 息就是启动相应的事件驱动程序。Windows中将响应消息的过程称为“消息映射”。 1.2 Windows编程方法 使用VC++进行Windows编程有两种方法。 1. 基于Windows API函数的编程方法 API是应用程序编程接口(Application Programming Interface)的缩写,是Windows操作系统与Windows应用程序之间的标准接口。作为Windows操作系统的组成部分(shell),API提供了1000多个可供应用程序直接调用的C函数(在Windows API参考手册中有详细介绍),这些函数大致可分为三类: ■窗口管理函数:实现窗口的创建、移动和修改功能。 ■图形设备接口函数:实现与具体显示设备无关的图形操作。 ■系统服务函数:实现操作系统提供的各种实用服务功能。 使用API设计Windows应用程序,对于理解和掌握面向对象程序设计的思想和方法是相当关键的,是想成为Windows编程高手的必经之路。但它要求编程者必须熟知Windows应用程序的框架、事件驱动以及消息传递等内部机制,并且仍然必须编写大量代码,即它要求编程者具备较高的专业素质,这对初学者来说无疑是比较困难的。当然,使用API编程更具灵活性和个性化。 API支持所有Windows应用程序的开发系统,如VC++、VB、Java等。 2. 基于Microsoft MFC的编程方法 MFC是微软基础类库(Microsoft Foundation Class)的缩写。与API不同,MFC不是Windows操作系统的组成部分,而是微软公司专为VC++开发的配套软件包。与VC6配套的是MFC6.0。 MFC充分使用了面向对象方法中的继承和多态性技术,以类的方式封装了Windows应用程序所涉及的几乎所有的标准部件,如Windows应用程序的框架、各种标准的图形界面元素、其核心是它以C++的形式封装了Windows API的大部分函数。 MFC是一个很大的类层次体系(MFC6.0中包含了200多个类),它由一个称为CObject的类作为根基类,其他类大部分从该类派生而来,其整个类体系可大致划分为: ■基类 ■应用程序框架类 包括:应用程序类、命令类、文档/视窗类、框架窗口类、文档模板类等 ■可视对象类 包括:窗口类、对话框类、控件类等 ■绘图类 包括:绘图工具类、设备描述表类等。 ■简单数据类型类 ■通用类 包括:数组类、类表类、映像类 ■文件和数据库类 包括:文件I/O类、ODBC类、DAO类、ADO类等 ■Internet和网络工作类 包括:Win32 Internet类、Windows Socket类类等 ■对象链接和嵌入(OLE, Object Lingking and Embedding)类 ■调试和异常类 事实上,MFC封装了一个Windows应用程序操作的每一方面,因此使用MFC编程,编程者可以把注意力集中于自己程序所特有的部分,不需要事事亲自动手。与直接调用API函数相比,这将大大减少编程者编写的代码数量,使编程工作变得更容易;同时,程序标准部分由MFC的类来提供,可使程序变得更规范,更具可读性,效率也更高。 对编程新手来说,MFC的最大优点是它以高效简洁的方式为编程者做了所有标准部分的工作,特别是编程者可以在不需要写一行代码的情况下完成一个完整的应用程序框架(约需千行代码)。MFC中包含了成千上万行功能强大的、经过优化的Windows程序代码。编程者只要定义了某个类的对象,就可以调用该类的成员函数,轻轻松松完成本该由你自己一行行编写的程序代码。从这点上说,MFC极大地降低了程序开发难度。 1.3 窗口 窗口是Windows图形用户界面的最基本和最重要的部件,每一个Windows程序至少有一个窗口。故Windows图形用户界面也称窗口界面。 1. 框架窗口 框架窗口是应用程序的主窗口,负责管理其包容的其他窗口。一个应用程序的最顶层的框架窗口是应用程序启动时创建的第一个窗口。 MFC提供了由基类CWnd(窗口类)派生的4个框架窗口类:CFrameWnd、