WINDOWS基础知识
出处:按学科分类—工业技术 企业管理出版社《工程师手册》第804页(7872字)
1.概述
在PC机工业发展的过程中,人们一直抱怨提供给用户与计算机间的通信方式太晦涩而难以领会。计算机语言与命令是由那些非常熟悉机器内部操作的专家设计的,而随个人计算机变得越来越实用且越来越大众化,更多的非专业人员开始使用它们,这些非专业人员需要一个简单、容易并直接了当地控制PC机工作的方式。
您可能已经知道,第一个用于IBM PC的操作系统是DOS。这个系统具有大多数用户所需要的功能,但是它有如下几个很明显的缺点:
(1)命令太多,不易记忆;
(2)高版本DOS设置复杂;
(3)人机界面不够友好;
(4)难以使用;
(5)在一个时间内只允许运行一个程序。
在PC机迅速发展的年代,一些研究人员基于图形用户界面(GUI)的想法,开发了一种新的控制计算机的方式。而隐藏在GUI后面的真正思想是建立一个可见的、计算机使用者可容易理解的环境。这种环境就是大家所说的Windows,它的中文意思就是“窗口”。
在电子桌面上,多个文件和程序可同时打开。计算机屏幕看上去就像一个普通的桌面,因为所有的东西都伸手可及。
有了电子桌面,人们就不用再记忆那些晦涩的命令,比如copya:*.*b:或者dir等命令。相反,可以通过选择不同的图形符号来进行操作,因为所有的操作都被初始化成了图标(icons),每一个图标都代表一个特定的操作。而且多个程序都可以同时驻留在计算机的内存中,我们可以悬挂一个特定的任务,同时又激活另一个任务。支持多个程序的能力可节约用户浪费在不断装入和退出程序上的时间。
多年来,这些概念只能在研究所中的实验计算机上完成,因为GUI要求更快的微处理器及更快的磁盘驱动器、更大容量的存储器和高质量的显示器。在80年代中期,Macintosh系列计算机率先打破传统,使用了第一个GUI。今天,市场上出现了许多GUI产品,可用于IBM PC及兼容机。事实上,这种界面正变得如此普遍,以至于想找到一个显示C>提示符的PC机都变得困难了。
Microsoft Windows的设计目标是为IBM PC及兼容机提供高质量的图形界面,一旦被装入,用户就可相当容易和直观地使用它。大多数用于Windows环境下的应用程序都遵循它特定的模式和设计原则。在这个友好的用户环境中,不同的程序以一致的方式操作。无论像运行一个汉字处理、一个电子表格或数据库,操作的基本技术(例如打开、关闭和打印文件)都是相同的。一旦用户知道了这些基本知识,就不用通过手册查询命令了。Windows还允许多个应用程序在同一时间被调入,这样用户可以迅速地从一个程序切换到另一个程序(某些实例中,可以从一个应用程序将信息传送给另一个程序)。Windows提供了一系列特殊的应用程序,允许用户编写文件,生成图形和维护卡片索引文件等。Windows在XT和AT机器上运行,这些微机使用Intel8088、80286、80386和80486系列的微处理器(或者兼容产品)。最好使用386/486处理器,因为它们拥有高级存储管理硬件,而286不具备这一功能。Windows也期望能有一个硬盘和至少2MB的内存,并使用鼠标(既可以是串行的,又可以是总线型)或者兼容产品。不用鼠标,Windows也可以通过键盘命令控制。但是只有使用鼠标,才能真正体现出Windows环境的用户友好性。
2.DOS应用程序和Windows应用程序的主要区别
它们的主要区别有五点。现从编程的角度简述如下:
(1)用户界面
标准DOS应用程序把显示屏幕全部分给一个程序使用,而其他程序在后台等待。Windows里的每一个应用程序一直都可以只对显示屏幕的某一部分进行存取。为了达到用户的交互性,Windows的应用程序可以利用窗口与其它程序共享显示器。这样,窗口就只是系统显示器的一个矩形区域,一个应用程序得到系统授权即可使用它。所谓窗口,还包括菜单及控制等,用户可以使用它们来非常直观地表现应用程序的动作。
在标准DOS环境里,系统会自动为应用程序准备系统显示。在Windows里,必须先创建自己的窗口,而且能创建任意数目的重叠窗口,以各种不同的方式显示信息。Windows负责管理显示屏幕、控制窗口位置和显示方式,确保没有两个应用程序在同一时刻试图存取系统显示器的同一部分。
(2)输入方式
在Windows下,应用程序不能像在DOS下的应用程序那样通过getchar()函数直接等待键盘输入,也不能直接写屏,而是使用适当的Windows函数,等待合适的处理环境,它们最大的区别就是接收用户输入的方式不同。
从应用程序的角度看,消息就是一种报告有关事件发生的通知,可以根据其到达与否采取相应措施。消息可以来自用户、Windows应用程序、应用程序之间及应用程序与Windows系统之间的相互作用,应用程序必须能够被消息激活并完全面向消息处理,根据收到的消息采取适当的操作,完成操作后再进入非活动区。简而言之,Windows应用程序是以输入消息的形式接收输入,输入消息由Windows负责发送。而且Windows输入消息所包含的信息种类也远远超过在标准DOS环境里可以得到的种类。它指定了系统时间、鼠标位置、键盘状态以及产生该消息的设备等,而且键盘、鼠标器和定时器的消息都有相同的格式,且都以相同的方式处理。
(3)与设备无关的图形操作集
由于Windows提供了丰富的与设备无关的图形操作集,所以可以使用相同的作图函数在点阵打印机或高分辨率显示器上画一个图形。
(4)设备描述表
Windows设备驱动程序为一个特殊的可执行库,应用程序可以加载并把它与特定的输出设备和端口相连接。设备描述表代表设备驱动程序和输出设备,可能还代表通信端口,应用程序在特定的设备描述表里进行图形操作。
(5)多任务
Windows应用程序必须与所有当前正运行的其它应用程序共享输出/输入设备、存储器、系统显示器,甚至CPU本身等资源,这就要求Windows应用程序使用一个特定的程序接口以保证对这些资源的控制。
在Windows里,主存是一个共享资源,要防止同时运行的多个程序因协调不好而耗尽资源。同时,Windows的多个应用程序共享显示器,任何一个程序都不能单独控制显示器。
3.面向对象的程序设计环境
一般人看到一部汽车时,只会把它当做一个整体而不会去分解它。装配工把它分解为车门、车厢、轮胎及发动机等。研究材料的人还要继续把它分下去,有些人把汽车部件分到分子甚至原子。直接处理原子的方法就相当于用传统的面向过程的语言解决问题的办法,而分解成部件的方法就相当于面向对象的程序设计方法。
从外部观察,面向对象的方法意味着更接近自然性,与人们观察世界的正常方法一致。在面向对象的程序设计中,对象(object)是一种抽象的数据类型,由一个数据结构和在该结构上作用的各种函数组成。此外,对象还可以接受消息并作相应操作。
严格讲,Windows本身并不是一个面向对象的程序设计环境,但Windows环境的基础结构还是很明显地受到了面向对象软件概念的影响,懂得一些Windows面向对象的基本概念能帮助你设计出更好的Windows应用程序源代码。
把Windows程序设计看做是面向对象的方法。例如一个图形对象是可以作为单一实体处理的数据聚集,它作为直观接口的一部分提供给用户。特别重要的是,图形对象既代表了数据,又代表了数据所表示对象的意义。这些图形对象的典型例子是菜单、标题框和控制框等。所以我们在学习编程时,首先应该弄懂各种对象的含义。
(1)WINDOWS的基本对象
①窗口
窗口是Windows应用程序的主要输入或输出设备,应用程序通过它对系统显示器进行访问。窗口是由标题条、滚动条、边框及系统显示器上矩形里出现的其它特性所组成,窗口就是一个对象。
当创建窗口时,可为窗口指定所要求的特性,如窗口的大小、位置等,然后Windows画出并管理这个窗口。
虽然应用程序创建了一个窗口,并对窗口有独占权,但该窗口的管理实际上仍是由应用程序和Windows共同协作完成的。Windows维护窗口的位置和显示,管理窗口的标准特征,如边框、滚动条和标题等,并执行许多由用户初始化的、直接影响窗口的任务。应用程序负责有关窗口的其它工作,其中较为突出的是负责维护窗口的用户区域,即窗口边框内的区域。应用程序对窗口用户区域的显示进行完全的控制。
为管理好这一协作任务,Windows要告知每个窗口如何进行修改。因此,每个窗口必须存在相应的“窗口函数”,它接收窗口管理信息并作出适当的处理,或执行适当的动作,或返回信息。
由此可见,窗口代表了Windows系统的基本子系统,这方面的实际作用与上述用户和程序之间的直观信息交换具有同等重要的地位。例如窗口本身代表了面向图形的用户接口,通过应用程序的直观重叠向用户表达Windows处理多任务的能力,从而也证明了Windows的设备独立于结构。对于在Windows下运行的每个程序而言,窗口就是它们的屏幕。由于Windows不允许应用程序直接使用物理屏幕,所有交互都必须通过窗口进行。当然,各种设备是有差异的,因为Windows介入应用程序和I/O设备之间,所以就由Windows自动处理这些差异。
窗口涉及边界、标题横条、控制框、系统菜单、极小框、极大框、垂直滚屏纵条、水平滚屏纵条、菜单横条、用户区、图标、光标及游标等具体对象。
②菜单
菜单在Windows应用程序里是用户输入的基本手段,它为用户查看和选择给定命令列表。当创建一个应用程序时,就提供了菜单和命令名。Windows为应用程序显示和管理菜单,并在用户作出选择时向窗口函数发送一消息,该消息是应用程序执行命令的信号。
③对话框、信息框和控制框
信息框(message box)是一个临时的弹出窗口,它由用户设计并在给定条件下向用户送出各种预定的消息。
对话框(dialig box)也是一个临时的弹出窗口,但它主要是供用户输入有关的消息或命令。对话框可以包含一个或多个“控制”,控制是一个小窗口,它具有非常简单的提示及接受输入的功能。对话框里的控制也可以让用户提供文件名或者选择任务,或者指示命令动作。
(2)消息循环
我们把Windows已经发生某些有关事件的通知称为一条消息,这种通知既可以要求特定的操作,也可能允许忽视不问。引起消息的事件可能来自用户、应用程序或Windows本身。
Windows消息提供了应用程序之间和应用程序与Windows系统之间的通信机制。Windows程序所做的事情几乎都是处理消息,程序中很大一部分代码都是用来处理这些消息的。
Windows中有一个系统消息队列,简称系统队列。当执行一个Windows应用程序时,Windows为该程序建立一个消息队列,简称应用程序队列。该队列存放该应用程序可能创建的各种窗口的所有消息。消息循环是应用程序中一段循环代码,专门用来从消息队列中检索这些消息并把它们分别发送到相应的窗口函数中去。
由于应用程序通过应用程序队列来接收输入,所以,Windows应用程序的主要特征就是消息循环。消息循环从应用程序队列中检索输入消息,并把它们发送到相应的窗口。
有些消息不必放到消息队列中而直接送给窗口函数,如Windows在撤消一窗口时,就直接发送WM_DESTROY消息给窗口函数。
总之,Windows只是通过消息才能取得多任务的能力,消息允许应用程序响应环境中的事件,Windows应用程序的主要任务就是处理消息。
4.WINDOWS应用程序开发
(1)最基本的WINDOWS应用程序开发过程
Windows应用程序除了包含常规意义下的源程序(.C、.ASM和.H文件)之外,一般还包括资源描述文件(.RC文件)和模块定义文件(.DEF文件)。假如我们不使用汇编语言和资源文件,通常建立一个基本Windows应用程序包括以下几步:
①创建C语言源文件,它们含有WinMain函数、窗口函数及其它应用程序代码。
②创建模块定义文件(.DEF文件)。它定义了应用程序模块的属性,如段属性及堆栈大小等。这些函数将被Windows直接调用,即回调函数(Callback Function),当然,基本应用程序只包含一个窗口函数。
③编辑并连接所有的C语言源文件。
(2)如何尽快掌握编程方法
学过Cobol语言的读者都知道,即使输出“Goodbye”这样一个最简单的要求,Cobol语言的程序也必须包括标识部、设备部、数据部和过程部等四大部分。也就是说:在一个Cobol程序中,这四大部分缺一不可。即使有些部的下面并无具体内容,也要写上“部头”。Cobol语言的每一部分又有许多规定,致使初学者感到头绪较乱,无从入手。所以学习Cobol语言就不能照搬BASIC、FORTRAN、PASCAL及C语言等按指令由浅入深、循序渐进的学习方法。这就要求我们必须先搞清四个部的作用,掌握编制最简单功能程序的正确格式。
通过对Cobol语言的分析可知,这四个部分中的核心是过程部,其他三个部分都是与过程部相配合以组成一个完整的程序。由此我们可以先弄懂四个部分的基本功能与用法,然后以过程部为主要线索,学习Cobol语言。
虽然Windows编程远比Cobol语言复杂,但我们也可以采取解剖Cobol语言编程的方法来分析Windows编程。
Windows是面向对象的编程方法,这些对象又不能像Cobol语言那样分成简单、明确的部。但我们可以选一个既简单又有代表性的程序,用它来展示Windows最基本的处理对象,以便达到入门的效果。
Windows处理的是对象,而这引进对象本身可能又是由一些复杂程度不同的对象堆砌而成。但困难的是:虽然可以把Windows编程分成许多独立的对象来认识,但编制一个简单的程序也必须包括许多个对象。简单程序之间的对象有些是共同的,所以编程又相当于许多相互关联的对象集合的堆砌。在一开始学习时,我们尽量以一个简单对象集合的程序为例,掌握编程的最基本的知识。这个简单程序包含了许多过去未接触的对象,尽管它可能使读者感到杂乱无章、枯燥无味,但读者也必须耐心地钻进去。一旦钻进去,就会感到“柳暗花明又一村”了。
由以上分析可见,利用Windows所提供的环境进行软件开发,表面上看要比用其他环境来开发软件复杂一些,编程风格也不同于其他高级语言(尽管Microsoft C是它所推荐的程序设计语言,但它具有自己的特点)。但所有Windows应用程序都共有某些相同的外部特征和行为特点,如边界、控制框及About框,这就使各种Windows应用程序的操作十分类似。因此,只要学会在Windows环境下编制一个完整的应用程序,再开发其他软件就得心应手了,反而觉得比在其他环境中更容易。
其实,Windows应用程序的基本外观相同,程序的结构也比较类似。所以应该把重点放在掌握Windows应用程序的结构上,并把程序设计思想调整到Windows消息驱动结构上来。
对于Windows应用程序的开发,最好的途径可能是有意识地模仿。但是,“创作从模仿开始,模仿不是创作。因此在模仿的基础上,必须努力发挥个人优势(如知识、智力等),就能很快掌握Windows应用程序设计,开发出自己的Windows应用程序。