《传统windows编程补充剖析》由会员分享,可在线阅读,更多相关《传统windows编程补充剖析(8页珍藏版)》请在金锄头文库上搜索。
1、传统 Windows程序设计基础知识补充Windows是一个具有可视化图形用户界面的多任务的操作系统,它为用户提供了风格统一的由窗口、菜单、工具栏等界面元素所构成的多任务环境。这里介绍传统Windows编程的一些基础知识,作为实践教材2.1节的补充。1Windows操作系统介绍1.1 Windows操作系统的特点Windows之所以取得成功,主要在于它具有以下优点:l 直观、高效、统一的面向对象的图形用户界面,易学易用Windows应用程序大多符合IBM公司提出的CUA (Common User Acess)标准,所有的程序拥有相同的或相似的基本外观,包括窗口、菜单、工具条等。用户只要掌握其中
2、一个,就不难学会其他软件,从而降低了用户培训学习的费用。从某种意义上说,Windows用户界面和开发环境都是面向对象的。采用“选择对象-操作对象”的方式进行工作。比如要打开一个文档,我们首先用鼠标或键盘选择该文档,然后从右键菜单中选择“打开”操作,打开该文档。这种操作方式模拟了现实世界的行为,易于理解、学习和使用。l 丰富的设备无关的图形操作Windows的另一特点是设备的无关性,即为Windows编写的应用程序可以运行于任何具有Windows设备驱动程序的硬件环境中。对于程序员来说,无需考虑不同硬件设备(如显示器、打印机或绘图仪等输出设备)的差异,只需当成输出设备使用进行编程。这是由图形设备
3、接口GDI (Graphic Devices Interface)实现的。 GDI还提供丰富的图形操作函数,可以绘制出诸如线、圆、框等的几何图形,并支持各种输出设备。l 多任务多进程在MS-DOS环境下,同一时刻只能运行一个应用程序,键盘、显示器等系统设备由一个程序独占。Windows是多任务的操作系统,同一时刻可以运行多个应用程序,即所谓多进程。同时运行的进程间可以进行信息交互,系统资源由操作系统管理,为所有进程共享。 Windows规定每个程序只能在一个称为“窗口”屏幕矩形区域中进行显示输出,每个应用程序对应至少一个窗口。当运行多个应用程序时,屏幕上将产生多个应用程序窗口,但其中只有一个是
4、活动窗口,当活动窗口拥有多个子窗口时,也只有一个子窗口是活动的。只有活动窗口才能有输入焦点,接受键盘与鼠标消息。在32位的Windows中,采用系统定时器将CPU时间按时间片方式,分配给系统中同时运行的多个进程,并且当前进程在其时间片未用完时可被更高优先级进程抢先使用CPU,称抢先式多任务系统。多个应用程序在不同时间片内拥有CPU,在用户看来,好像是多个应用程序在同时运行。1.2 Windows的内存管理在多进程模式操作系统中,必须保护每个进程的安全运行,防止被同时运行的其它进程所破坏,Windows系统采用虚拟内存提供这种保护。在Windows操作系统中有两种存储器概念:物理存储器和虚拟存储
5、器。虚拟存储器不是真实的物理存储器,而是虚拟地址空间。Windows操作系统提供32位虚地址,因此每个进程的虚拟地址空间达4GB(bytes)。其中低端2GB(对Windows NT,可选3GB)为用户地址空间,而操作系统保留2GB(或对应为1GB)。虚拟内存系统的工作过程如下: 1当建立一个新进程时,操作系统赋予每个进程4GB的虚拟地址(不是内存)。 2虚拟内存管理器把应用程序的代码映射到应用程序的虚拟地址空间的某个位置,并把当前所需要的代码加载到物理内存。(虚拟地址与应用程序代码在物理内存中的位置无关) 3如果应用程序使用了动态链接库(DLL),则DLL被映射到进程的虚拟地址空间,并在需要
6、时加载到物理内存。 4分配程序的数据和栈需要的空间,并映射到虚拟地址空间。 5应用程序使用虚拟地址空间中的地址开始执行,虚拟内存管理器把每个对虚拟内存的访问映射到物理内存。从开发人员的角度看,一个应用程序是在一个4GB大小的虚拟内存中运行,而不管它实际运行的物理内存有多大。至于虚拟内存怎样映射到物理内存,是由Windows操作系统的虚拟内存管理器在CPU的硬件支持下完成的。这样既保证了程序的健康运行,又简化了内存管理。强制使用虚拟内存允许操作系统在物理内存上严格分离各个进程,保护进程不受破坏;对于应用程序来说,4GB内存足够使用,无需考虑内存空间大小。2传统的Windows 程序设计Windo
7、ws程序设计具有图形用户界面、多任务、多窗口等特点。Visual C+提供两套完整的Windows 程序开发系统,一种是直接使用Windows提供的API (Application Programming Interface 应用程序编程接口)函数,称为传统的wingdows程序设计;另一种是采用面向对象的方式,使用微软基础类库MFC (Microsoft Foundation Classes),称为标准的wingdows程序设计。2.1 Windows API简介Windows API是Windows 系统和Windows 应用程序间的标准接口,为应用程序提供Windows支持的函数定义、参
8、数定义和消息格式等,总共有上千个Windows API 函数,可完成各种系统功能,如创建窗口、显示文字、显示一个信息窗口等。标准Win32 API 函数可以分为以下几类:1) 系统服务系统服务函数为应用程序提供了访问计算机资源与底层操作系统特性的手段,包括内存管理、文件系统、设备管理、进程和线程控制等。应用程序使用系统服务函数来管理和监视它所需要的资源。2) 通用控件库系统提供了一些通用控件,这些控件属于操作系统的一部分,可供所有的应用程序使用。使用通用控件有助于使应用程序的用户界面与其它应用程序保持一致,同时直接使用通用控件也可以节省开发时间。3) 图形设备接口图形设备接口GDI(Graph
9、ic Devices Interface)提供了一系列函数和相关的结构,可以绘制直线、曲线、闭合图形、文本以及位图图象等,应用程序可以使用它们在显示器、打印机或其他设备上生成图形化的输出结果。4) 网络服务网络服务可以使网络上不同计算机的应用程序之间进行通信,使用网络函数可以创建和管理网络连接,从而实现资源共享,例如共享网络打印机。5) 用户接口用户接口函数为应用程序提供了创建和管理用户界面的方法,可以使用这些函数创建和使用窗口来显示输出、提示用户进行输入以及完成其他一些与用户进行交互所需的工作。大多数应用程序都至少需要创建一个窗口。6) 系统外壳ShellWin32 API 中包含一些接口和
10、函数,应用程序可使用它们来扩展系统外壳各方面的功能,如在资源管理器中提供各种快捷操作等。7) Windows 系统信息系统信息函数使应用程序能够确定计算机与桌面的有关信息,例如确定是否安装了鼠标,显示屏幕的工作模式等。Win32 API 是一个基于C 语言的接口和函数,但是Win32 API 中的函数可为使用不同语言编写的程序所调用,只要在调用时遵循调用规范即可。Windows 程序设计不同于控制台应用程序面向过程的特点,它必须符合Windows图形用户界面、多任务、多窗口等特点,学习Windows 程序设计,必须了解有关Windows 编程的一些概念。2.2 Windows程序设计的一些基本
11、概念1. 窗口窗口是Windows程序的基本操作单元,是应用程序与用户之间进行交互的接口,也是系统管理应用程序的基本单位。编写应用程序其实就是创建一个或多个窗口,程序的执行过程是窗口内部、窗口与窗口之间以及窗口与系统之间进行数据交换与处理的过程。在winuser.h中定义了代表窗口的WNDCLASS结构类型。typedef struct tagWNDCLASS UINT style; / 窗口风格WNDPROC lpfnWndProc; / 指向窗口处理函数的函数指针Int cbClsExtra;/ 窗口结构中的预留字节数IntcbWndExtra; / 本窗口创建的其它窗口结构中预留字节数H
12、INSTANCEhInstance;/ 注册该窗口类的实例句柄HICON hIcon;/ 代表该窗口类的图标句柄HCURSORhCursor; / 该窗口客户区鼠标光标句柄HBRUSHhbrBackGround; / 该窗口背景颜色句柄LPCSTRlpszMenuName;/ 指向窗口菜单名的字符指针LPCSTRlpszClassName;/ 指向窗口名的字符指针 WNDCLASS, *PWNDCLASS, NEAR *NPWNDCLASS, FAR *LPWNDCLASS;与窗口相关的概念还有窗口的标题栏、边框、菜单栏、系统菜单、最大最小化及关闭按钮、工具栏、状态栏、滚动条、图标、光标等。对
13、话框也是一种窗口,其中包含的按钮、编辑框、静态文本等等,称为控件。控件也是一种窗口,一般作为对话框的子窗口。2. 事件与消息Windows程序设计是面向事件的。在Windows环境下,应用程序启动后,系统等待用户在图形用户界面内的输入选择,如鼠标按键、键盘按键、窗口被创建、关闭、改变大小、移动等,在Windows看来,这些都是事件。只要有事件发生,系统即产生特定的消息,驱动相应的处理函数进行处理,因此Windows 应用程序也称为事件驱动程序。消息描述了事件的类别,包含了相关信息,Windows应用程序利用消息与系统及其它应用程序进行信息交换。由于windows事件的发生是随机的,程序的执行先
14、后顺序也无法预测,系统采用消息队列来存放事件发生的消息,然后从消息队列中依次取出消息进行相应的处理。在winuser.h中,消息结构的定义如下:typedef struct tagMSG HWND hWnd;/指定消息发向的窗口句柄UINTmessage;/标识消息的消息值WPARAMwParam;/消息参数LPARAMlParam;/消息参数DWORDtime;/消息进入队列的时间POINTpt;/消息进入队列时鼠标指针的屏幕坐标MSG,*PMSG,NEAR *NPMSG, FAR * LPMSG;下面介绍消息结构中各个成员的意义。a) message是标识消息的消息值或消息名。每个消息都有
15、唯一的一个数值标识,常用不同前缀的符号常量以示区别。例如,WM_表示窗口消息,BM_表示按钮控件消息,EM_表示编辑框控件消息,LB_表示列表框控件消息等等。下面是Windows常用的窗口消息和消息值定义,定义于winuser.h中:#define WM_CREATE0X0001/创建窗口产生的消息#define WM_DESTROY0X0002/撤销窗口产生的消息#define WM_PAINT0X000F/重画窗口产生的消息#define WM_CLOSE0X0010/关闭窗口产生的消息#define WM_CHAR0X0102/按下非系统键产生的字符消息#define WM_USER0X0400/用户自定义消息WM_USER为用户自定义消息,用户可用WM_USER+n定义程序中需要的消息。b) wParam和lParam都是32位消息参数,其数据类型在windef.h中定义如下:typedef UINTWPARAM;typedef LONGLP