Windows-编程基础——概述.pdf

上传人:w**** 文档编号:73834322 上传时间:2023-02-22 格式:PDF 页数:25 大小:1.54MB
返回 下载 相关 举报
Windows-编程基础——概述.pdf_第1页
第1页 / 共25页
Windows-编程基础——概述.pdf_第2页
第2页 / 共25页
点击查看更多>>
资源描述

《Windows-编程基础——概述.pdf》由会员分享,可在线阅读,更多相关《Windows-编程基础——概述.pdf(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、 1.1、Windows 的介绍 Windows 是一种基于图形界面的多任务操作系统。为这个环境开发的 程序有着相同的 外观和命令结构。对用户 来说,这使得学习使用 Windows 应用程序变得容易了。为了帮助 开发 Windows 应用程序,Windows 提供了大量的内建 函数以方便地使用弹出菜单、滚动条、对话框、图标和其他一些友好的用户界面应该具有的特性。Windows 运行应用程序以硬件无关的方式来处理视频显示、键盘、鼠 标、打印机、串 行口以及系统时钟。最值 得注意的 Windows 特性就是其标准化的图形用户界面。统一的界 面使用图片或图标来代表磁盘驱动器、文件、子目 录以及其它操

2、作系统的命令和动作。统 一的用户界面也为程序员带来了好处。例如,你可以很方便地 使用常见菜单和对话框的内 建函数。所有的菜单都具有相同风格的键盘和鼠标接口,因为 是 Windows 而不是程序员在 实现它。Windows 的多任务环境允许用户在同一时刻运行多个应用程序或同一 个应用程序的多 个实例。一个应用程序可 能处于激活状态。激活的应用程序是指它正接收用户的输入。因 为每一个瞬间仅有一个程序能够被处理,因此同一时间也只能 有一个应用程序处于激活状 态。但是,可以有任意个数的并行运行的任务。1.2、Windows 的简要历史 Windows 最初由 Microsoft 公司在 1983 年

3、11 月宣布,1985 年 11 月推出了第一公开发 行版本,即 1.01 版。此后两年,1.01 版进行了几次修改以满足国际市场 的需求,并增减 了一些显示器和打印机的驱动程序。1987 年 11 月发行的 Windows 2.0 版在用户界面上做 了些改进。例如:重叠式窗口的引入,还增强了键盘和鼠标接 口,特别是增强了选单和对 话框的功能(略)1.3、用户界面的构件 1.3.1 窗口 窗口是屏幕上与一个应用程序相关的矩形区域,它是用户 与产生该窗口的应用程序之 间的可视界面。对应用程序来说,窗口是应用程序控制下的屏 幕上的一个矩形区域,应用 程序创建并控制窗口的所有方面。当用户启动一个应用

4、程序时,一个窗口就被创建。每当 用户操作窗口中的对象时,程序就有所响应。1.3.2 边框 绝大多数窗口都有一个环绕着它的边框,边框不仅作为窗 口的边界,它也用来指明窗 口的状态,即窗口是否是一个活动窗口。当我们将鼠标指针放 在边框上按下鼠标键并移动 鼠标时,就可以改变窗口的大小。1.3.3 标题栏 标题栏位于窗口的顶部,其中显示的文本信息用于标注程 序,一般是应用程序的名字,这便于用户知道哪个应用程序正在运行。标题栏的颜色反映 一个窗口是否是一个活动窗 口。1.3.4 控制框 控制框是每个窗口左上方的小图片,每个应用程序都使用 它。在控制图标上单击鼠标 1 键会使 Windows 显示系统菜单

5、。系统菜单它提供了诸如还原、移动、大小、最小化、最大 化以及关闭这样的标准操作。1.3.5 最小化图标 每个 Windows 98 及 Windows NT 应用程序都在窗口的右上角显示三个图标。最左边的 图标是一段短下划线,这就是最小化图标。它可以使用程序被 最小化。1.3.6 最大化图标 最大化图标是三个图标中中间的那一个,看起来象两个小 窗口。使用最大化图标可以 使用应用程序占满整个屏幕。如果选择了这个图标,其它应用 程序窗口都会被盖住。1.3.7 垂直滚动条 如果有必要,应用程序可以显示一个垂直滚动条。垂直流 动条显示在应用程序窗口的 右边,在两端有两个方向相反的箭头。它还有一个着色的

6、棒和 一个透明的窗口块。后者被 用于显示当前显示内容与整个文档的关系。你可以用滚动条来 选择显示哪一页。一般在任 何一个箭头上单击一下会使显示内容移动一行。单击向上箭头 下方的窗口块并拖动它会使 屏幕输出快速更新到应用程序屏幕输出的任意位置。1.3.8 水平滚动条 也可以显示一个水平滚动条。水平滚动条显示在窗口的底部,具有与垂直滚动条类似 的功能。你用它来选择 要显示哪些列。一般在任何一个箭头上单击一个会使显示内容移动 一列。单击向左箭头右边的窗口块并拖动它会使屏幕输出快速 更新到应用程序屏幕输出的 任意位置。1.3.9 选单栏 一个可选择的菜单条可以显示在标题条的下方。通过菜单 条来选择菜单

7、和子菜单。这 种选择可以通过用鼠标单击,也可以用热键组合来实现。热键 组合经常是 ALT 与命令中带 下划线的字母的组合,比如 File 命令中的“F”。1.3.10 用户区 通常用户区占据了窗口最大的部分。这是应用程序的基本 输出区域。应当由应用程序 来复杂管理用户区。另外,应用程序可以输出到用户区。1.4、面向对象的思维方法 对于程序员来说,面向对象意味着非常熟悉的事物:将世 界看成是一组彼此相关并相 互通信的实体即对象组成,每个对象有一个名字来标识,这是 人们通常看待世界的方式。例如,当看见一辆汽车时,所见到的是一辆汽车,而不是一大 堆原子。人们可以将汽车分 解为车轮、发动机、车门、油箱

8、等,它们都是具体的实体即对 象。对象之间的通信被称为发送消息,即一个对象请求另一个 对象执行某种方式的操作。例如,交叉路口的红灯“请求”驾驶员停车,驾驶员在接受到 消息之后,他所执行的动作 是踏下制动踏板,这有向汽车发送了一条消息,汽车在接受到 此消息之后,又将该消息分 解之后发送到相关的对象上:制动器作用于车轮上,将动能转 变成为势能,使车速降下来;尾灯又向它后面的其它车辆的驾驶员发送消息;各种仪表盘 向驾驶员反馈出所发送的消 2 息的动作结果。从程序员角度而言,对象是内存中一块有名的存储单元。我们通常所谓的变量就是一 种数据对象,但对象的概念比变量的含义更广义,通常将对象 定义成为包含有数

9、据和代码 的内存区域,数据表征对象的特征,而代码用于响应消息,使 对象进行某些动作。从屏幕 上显示的一个可视的窗口对象为例,我们可以对比分析一下用 户心目中的对象和程序员心 目中的对象的关系。窗口对象的特征,例如颜色、长度、其中 显示的信息等,在程序中被 表示为数据,用户对窗口对所做的操作,例如移动窗口、改变 窗口的大小等,使得用户向 窗口发送了消息,这些消息引起了计算机(内存中的)对象执 行相应的代码,代码执行的 结果改变了对象中的数据,使对应的可以视对象 的位置和大小发生了变化。对象为响应消息所执行的代码被称为方法,对象中保存的 数据构成对象的属性,对象 的抽象定义就是执行某些动作,否则,

10、没有其它途径可以使一 个对象动作起来。向一个对 象发送消息在程序中表示为:functionName(id,arg1,arg2,.);其中,消息是 functionName,id 是标识对象的一个对象名,或称其为对象的标识符,Windows 使用某种类型的 数据来作为对象的标识符,这个标识符号常被称为对象的句柄。arg1 等为消息所带的参数。虽然发消息类似于标准的函数调用,但消息也有函数调用 中没有的特性,例如,消息 始终在执行一选择机制,其参数与其它消息区别开来,从而告 诉该对象完成什么样的操作。一个函数名始终指向内存中该函数的代码所位于的确定地址,消息并不指向内存中的某 地址,但却告诉接受消

11、息的对象要引用的内存地址是什么。函 数不仅说明操作,而且还要 执行如何完成该操作的方法。消息只说明该操作,在对象中定 义的方法说明如何完成该操 作。当向不同的对象发送相同的消息时,所执行的方法是不同 的。在面向对象的程序设计中,每个对象由一个类来定义,类 是对一组性质相同的对象的 程序描述,它是由概括了一组对象共同性质的方法和数据组成。从一组对象中抽象出公共 的方法与数据,将它们保存在一个类中是面向对象程序设计的 核心。在日常生活中,我们也以类这种方式来定义客观对象。通 过对客观对象进行抽象,我 们将性质相同的对象归为一类,形成概念,例如,人类、苹果 类、食品类等。通过对客观 对象分类,我们也

12、可以更好地认识客观对象,例如,当知道张 三是一个人时,不用对张三 进行更多的描述,我们已知道张三作为一个人所具有的特征和 行为,因为它们已经在“人”类中进行了描述。在面向对象的程序中,类被用作样板来生产具有相同行为 方式的对象。类就像是生产 对象的一个工厂,在生产对象时,对象具有类中所描述的同样 的数据结构和方法,同时,对象的每个数据在创立之初取得一个初始值,形成对象的初始 状态。对象通过发送消息相 互作用,对象的状态从一种状态过渡到另一种状态,当所有的 有关对象到达某种特定的状 态时就得程序的运行结果。使用类产生对象的过程也称为生成该类的一个实例。因此,对象也可以定义为对象是 类的一个实例。

13、定义类也意味着将该类的对象公用代码放在内 存的公共区域中,而不必对 每个对象都将它们的代码和数据重新进行一次描述,这减轻了 程序员的劳动强度。我们可 以将一些常用对象定义放在一个公用库中,而在程序中需要该 类的一个对象时,就创建该 类的一个实例。Windows 已为程序员预定义了许多像按钮、滚动杠和对话 框等对象的类,当程序员需要这些类的对象时,仅需创立该类的实例即可。对 于同一个类的不同对象,在 3 4 建立对象时其初始状态不同,因而这些对象在屏幕上显示的位 置、大小等属性也不相同,但同类的对象的操作是相同的(因为它们共用相同的方法)。这也就是为什么不同的 Wind ows 应用程序对用户表

14、现出一致的操作特性的原因之一。1.5、句柄 Windows 应用程序中存在许多对象,例如选单、窗口、图标、内存对 象、位图、刷子、设备对象和程序实例等,在 Windows 中,对象使用句柄进行标识,这样,通过使用一个 句柄,应用程序可以访问一个对象。在 Windows 软件开发工具中,句柄被定义为一种新的数据 类型。在应用程序中,对句 柄的使用一般只有赋值(句柄可以被赋以初始值、被改变为用 于标识同类对象中的另一个 对象和被用作函数的参数)、与 NULL 进行相等比较(判定一个句柄是否为一个有效的句柄)和与标识同类对象的另一个句柄进行相等比较(判定两个句 柄是否标识同一个对象),没有其它的运算

15、。虽然在有的书中介绍说句柄是一个十六位的 整数,但实际情况并不这样 简单,它的长度将会随着不同的计算机平台和 Windows 的发展而有所变化,例如,在 32 位 Windows 中,句柄将是一个 32 位的数据,并且不是整数类型。一种通用句柄类型为 HANDLE,在 Windows 3.1 以前的版本中,它可被用于标识所有种 类的对象,在 Windows 3.1 中,部分地保留了这一特点,在本教程的程序中也有所反映。在 Windows 3.1 中,从 HANDLE 类型又派生出了一些新的句柄数 据类型,每种类型的句柄用 于标识一种类型的对象,下面是一些常见的句柄类型:类型 说明 HANDLE

16、 通用句柄类型 HWND 标识一个窗口对象 HDC 标识一个设备对象 HMENU 标识一个选单对象 HICON 标识一个图标对象 HCURSOR 标识一个光标对象 HBRUSH 标识一个刷子对象 HPEN 标识一个笔对象 HFONT 标识一个字体对象 HINSTANCE 标识一个应用程序模块的一个实例 HLOCAL 标识一个局部内存对象 HGLOBAL 标识一个全局内存对象 1.6、数据类型及常量 为便于开发 Windows 应用程序,Windows 的开发者新定义了一些数据类型。这些数据 类型或是与 C/C+中已有的数据类型同义,或是一些新的结构数据类型。引入这些类型的 主要目的是为便于程序

17、员开发 Windows 应用程序,同时也是为了增强程序的可读性;另一 个目的是为了便于程序将来能被移植到其它种类的计算机平台 上或适应 Windows 将来的新 版本的变化。例如,本教程目前使用 16 位 API(Application Program Interface),现 5 在 Windows 的版本使用 32 位 API,只要将 HANDLE 等句柄类型定义为 32 位长,然后重新编 译程序,就可以很方便地将一个使用 16 位 API 的 Windows 应用程序改为使用 32 位 API 的 程序,使其能运行在 32 位 API Windows 上。大部分的数据类型在 Window

18、s.h 中定义,下面 是在这个文件中定义的部分类型:#define PASCAL pascal#define NEAR near#define FAR far typedef unsigned char BYTE typedef unsigned short WORD typedef unsigned long DWORD typedef long LONG typedef char *PSTR typedef char NEAR *NPSTR typedef char FAR *LPSTR typedef void VOID typedef int *LPINT typedef LONG (

19、PASCAL FAR*FARPROC)();在 Windows.h 中,使用 typedef 还定义了一些新的结构类型。这些结构类型的名字也 使用大写形式的标识符:类型 说明 MSG 消息结构 WNDCLASS 窗口的类的结构 PAINTSTRUCT 绘图结构 POINT 点的坐标的结构 RECT 矩形结构 我们在这里以类型 MSG 为例来说明类型的定义方法,对于其它类型,在以后用到时再 作详细地说明。类型 MSG 是一个消息结构,它的定义方式及其各域的含义如下:typedef struct tagMSG HWND hWnd;/窗口对象的标识符,该条消息传递到它所标 识的窗 口上 UINT m

20、essage;/消息标识符,标识某个特定的消息 WPARAM wParam;/随同消息传递的 16 位参数 LPARAM lParam;/随同消息传递的 32 位参数 DWORD time;/消息产生的时间 POINT pt;/产生消息时光标在屏幕上的坐标 MSG;typedef MSG FAR*LPMSG;其中的 POINT 类型的定义是:typedef struct tagPOINT int x;/*X 坐标*/int y;/*Y 坐标*/POINT;typedef POINT FAR*LPPOINT;Windows.h 在定义大部分类型的同时,还定义了该类型的指针类型。例如,上例中的 L

21、 PPOINT 和 LPMSG 等,其中字母前缀 LP 表示远指针类型;若使用 NP 作为一个类型的前缀,则表示近指针类型;若使用 P 作为一个类型的前缀时,则表示一般的指针类型,这 时由编 译程序时所使用的内存模块决定这种指针是远指针或是近指针。在 Windows.h 中说明的大 部分指针类型都采用这里介绍的方法进行说明,例如,LPRECT,它表示一个 RECT 类型的远 指针。在 Windows.h 中说明的大部分指针类型使用了 C/C+的关键字 const,如果一个指针类 型的名字前缀为 LPC、NPC 或 PC,则其中的字母 C 表示这种类型的指针变量所指向的变量 不能通过该指针变量来

22、修改,这种指针类型一般采用下述方法 进行说明:typedef const POINT FAR*LPCPOINT;typedef const REC FAR*LPCRECT;一个使用 const 修饰的指针(称其为 const 指针)可以指向没有使用 const 修饰的变 量,但没有使用 const 修饰的指针不能指向 const 修饰的变量,例如:const POINT pt;LPCPOINT lpPoint=&pt;/正确 LPPOINT lpPoint=&pt;/错误 当向函数传递参数时,必须特别注意这个问题,例如:void fun(LPPOINT lppt);.LPCPOINT lpPo

23、int;fun(lpPoint);编译器将指示这个函数调用语句是错误的。所以,在一个 函数不修改一个指针参数所 指向的变量的情况下,最好将该参数说明为 const 指针,使 const 类型的指针也能用于该 函数的参数。Windows.h 中说明的大部分函数使用了 const 指针参数。在 Windows.h 中,大多数语句是用于定义一个常量,例如:#denfine WM_QUIT 0X0012 6 7 该语句用标识符 WM_QUIT 来表示编号为 0X0012 的消息。每个常量由一个前缀和表示其 含义的单词组成的标识符组成,两者之间用下画线隔开。前缀 表明这些常量所属的一般范 畴。下面是一些

24、前缀和它们所属的范畴的说明。类型 说明 CS 窗口类的风格(Class Style)IDI 预定义的图标对象的标识符(IDentity of Icon)IDC 预定义的光标对象的标识符(IDentity of Cursor)WS 窗口的风格(Windows Style)CW 创建窗口(Create Windows)WM 窗口消息(Windows Message)DT 绘制文本(Drawing Text)在变量名的表示方法方面,Windows 推荐使用一种称为“匈牙利表示法”的方法。每 个变量名用小写字母或描述了变量的数据类型的字母作为前缀,变量的名字紧跟其后,且 用大写字母开始的单词(一个或多

25、个单词)表示其含义,这样 每个变量都能附加上其数据 类型的助记符。例如:WORD wOffset;/*w 表示 WORD 类型*/DWORD dwValue;/*dw 表示 DWORD 类型*/下面是 Windows 中常使用的一些字母前缀和它们所代表的 数据类型:类型 说明 b BOOL,布尔类型 by BYTE 类型 c char 类型 dw DWORD 类型 fn 函数类型 i 整型 l LONG 类型 lp 远(长)指针(long pointer)n 短整型 np 近(短)指针(near pointer)p 指针 s 字符串 sz 以0结尾的字符串 w WORD 类型 x short,

26、用于表示 X 坐标时 y short,用于表示 Y 坐标时 1.7、应用程序使用的一些术语 本节介绍 Winodws 应用程序使用的一些术语及其相关概念,在后面的章节中介绍有关 的内容时,再对其中的概念进行详细的讨论。1.7.1 模块 在 Windows 中,术语“模块”一般是指任何能被装入内存 中运行的可执行代码和数据 的集合。更明确地讲,模块指的就是一个.EXE 文件(又称为应用程序模块),或一个动态 链接库(DLL Dynamic Linking Library,又被称为动态链接库模块或 DLL 模块),或 一个设备驱动程序,也可能是一个程序包含的能被另一个程序 存取的数据资源。模块一词

27、 也被用于特指自包含的一段程序。例如,一个可单独编译的源 文件,或该源文件被编译器 处理之后所生成的目标程序。当制作一个程序时,模块一词用 于指被连接在一起的许多模 块中的某个模块。Windows 本身由几个相关的模块组成,Windows API 函数就是在 Windows 启动时装入内 存中的几个动态链接库模块实现的。其中的三个主要模块是 USER.EXE(用于窗口管理等)、KERNEL.EXE(用于内存管理的多任务调度)和 GDI.EXE(图形设备接口,用于图形输出 等)。1.7.2 应用程序 一个 Windows 应用程序是被 Windows 调用或在 Windows 下运行的一个程序,

28、这个程序 可以调用静态连接库(也就是 C 的运行时间库)中的函数和 DLL 的函数,它也可以启动其 它的应用程序。一个应用程序在运行时的输入被 Windows 捕获,并以消息的形式传送到应 用程序的活动窗口上。一个应用程序的输出也是通过 Windows 进行的,所有的输出首先被 送给 Windows。许多 MS-DOS 应用程序基本上占据整个计算机,并认为所 有的计算机资源只 属于该应用程序,应用程序告诉相对被动的 MS-DOS 应做什么。在一个 Windows 应用程序中,Windows 自身是非常主动的,并且和应用程序协同得非常紧密。Windows 管理着计算机的 所有资源,并调度这些资源

29、,使它们可为正在 Windows 上运行的所有应用程序共享。1.7.3 任务和实例 Windows 将运行的应用程序实例作为不同的任务。当一个应用程序的 多个实例在运行 时,它们也被 Windows 当作不同的任务。Windows 为一个模块的每一个实例都装入一个缺 省数据段,但可执行代码只能装入一次。也就是说,同一个模 块的实例共享相同的代码,但有自己私用的数据段。对每一个模块、任务或实例,Windows 分别使用一个句柄来标识它。在窗口对象的私 有数据存储区存储有一个应用程序的任务句柄、实例句柄和模 块句柄。任务句柄被 Window s 的任务调度程序用于进行任务调度。通过模块句柄,Win

30、dows 可以知道一个模块当前有多 少实例正在运行。同一个模块的不同实例有相同的模块句柄,但有不同的任务和实例句柄。当 Windows 由于内存管理的需要而废弃了一个实例的代码段 时,通过模块句柄,Windows 8 Windows 程序员也可以根据上述思想和使用目的,发明一些其他的前 缀,但要注意,对这些前缀的使用必须保持前后一致。在 Windows 中,所有的函数根据其用途来命名,它 们一般由 2 到 3 个英文单词组成,每个单词的第一个字母大写,例如,函数 CreateWindow(),由该函数的名字可以知道它的用途是创建一个窗口。可以从模块中重新装入这个实例所需的代码。1.7.4 动态

31、链接库 DLL 是一种有别于 MS-DOS 应用程序所使用的库模块(例如 C 的运行时间库)的一种特 殊的库模块,它含有可能 被其它应用程序调用的函数。一个 DLL 在运行时被动态地连接到 一个应用程序中或另一个 DLL 中,而不是在制作应用程序时静态地连接到应用程序中的(这种方法是在制作 MS-DOS 应用程序中使用的方法,它们在 Windows 应用程序中仍然可以继 续被使用)。使用 DLL 的好处在于,当有多个应用程序使用同一个 DLL 并且同时在 Window s 中运行时,该 DLL 在内存中只有一个实例。1.7.5 应用程序设计接口 应用程序设计接口(API)是应用程序用于操作周围

32、环境的一组函数调用接口。Window s API 大约有 600 多个函 数,学习 Windows 程序设计的许多工作就是学习如何使用这些 AP I。1.7.6 Windows 下的函数 在进行 Windows 应用程序设计中,程序员除了需要知道有 关一个函数的常用信息(例 如函数的名字,近函数或远函数,返回类型以及应如何调用)之外,同时还要知道更多的 内容:一个回调函数、引出函数或是一个引入函数。引出函数:这个术语与一个函数如何在一个模块中说明而在另一个模块中被调用有关 。引出函数是在一个模块中定义而在这个模块之外被调用的一 种函数;或是被 Windows 或 是被另一个模块调用。这些函数必

33、须以一种特定的方式进行说 明,并被编译器作特殊的处 理。这样,当它们被调用时,它们会被正确地束定到合适的数 据段上。DLL 为其它模块提 供要被调用的函数,因此,每个 DLL 一般都带有一个 DLL 库,以便应用程序可以合法地调 用 DLL 中的函数。DLL 库由 DLL 中每个引出函数的入口点组成。整个 Windows API 就是由 构成 Windows 环境的不同的模块所引出的函数组成,这些 API 函数的入口点在一个名为 IM PORT.LIB 的 DLL 库中说明。引入函数:在 DLL 中引出的函数若要能为一个模块调用,必须在这个模块中将这个函 数说明为引入函数。由此可见引出函数和引

34、入函数表达的是从 两种角度处理同一个函数的 术语:引出模块中的一个函数使得这个函数能被其它模块调用;调用引出函数的模块通过 引入这个函数才能调用它。在制作 Windows 应用程序时,连接器自动包含一个名为 IMPORT.L IB 的库文件。这个文件允许应用程序调用 Windows API 中的函数。这个文件被称为引入库。引入库提供了应用程序与一个到多个 DLL 中可被这个应用程序调用的函数之间的连接。回调函数:回调函数是一种特殊的引出函数,是由 Windows 环境直接调用的函数。一 个应用程序至少要有一个回调函数。当一条消息要交给应用程 序处理时,Windows 调用这 个回调函数。这个函

35、数对应于一个活动窗口,被称为这个窗口 的窗口函数。因为许多应用 程序至少建立一个窗口,并且 Windows 需要向这个窗口发送消息,所以,处理消息的函数 必须由 Windows 调用。在请求 Windows 枚举它所维护的对象时,例如字体或窗口,Windows 也要调用应用程序中的回调函数。当向 Windows 提出这样的请求时,就必须向 Windows 提 供回调函数的地址。由于引出函数是在不同的模块中被调用的,也就是说,调 用者的代码段与被调用的引 出函数的代码段不在同一个段中,因此,在所开发的 Windows 应用程序中,引出函数都被 9 10 说明为远函数。为了程序运行的效率原因,引出

36、函数都使用 Pascal 调用约定,这种调用约 定不同于 C 调用约定的地方在于:最左边的参数先入栈:Pascal 调用约定的参数进入栈的顺序是函数调用 中最左边 的参数先入栈。C 的调用约定与此相反,它采用最右边的参数先入栈。被调用的函数负责从展中清除参数:Pascal 调用约定的函数在返回时负 责清除栈 中的参数;C 调用约定的函数不作这种工作,而由调用者来作;这样,当 程序中调 用了大量的使用 C 调用约定的函数时,为清除栈中的参数,在 程序中要额外地增加 许多代码。全局标识符不保持原来的大小写(一般被为大写形式),也不 在标识符前面加下划 线。为便于程序开发活动,在 Windows.h

37、 中定义了两个类型名,用于在程序说明引出函数:类型 说明 WINAPI 等价于 FAR PASCAL,说明该函数是一个引出函数,这个类型名只用于在 DLL 中说明 引出函数,或在应用程序中对 DLL 中的引出函数进行函数说明时。CALLBACK 等价于 FAR PASCAL,说明该函数是一个回调函数,它常被用在应用程序模块中说明 一个窗口函数或其它种类的回调函数。1.8、事件和消息 在 Windows 中,用户或系统中所发生的任何活动被当作事 件来处理,例如,用户按下 了鼠标按钮,就产生一鼠标事件。对于所发生的每一个事件,Windows 将其转换成消息的 形式放在一个称为消息队列的内存区中,然

38、后由 Windows 的消息发送程序选择适合的对象,将消息队列中的消息发送到欲接受消息的对象上。Windows 的消息可分为四种类型:(1)输入消息:对键盘和鼠标输入作反应。这类输入消息首先放在系统消息队列中,然后 Windows 将它们送入应用程序的消息队列,使消息得到处 理。(2)控制消息:用来与 Windows 的特殊控制对象,例如,对话框、列表框、按钮等进 行双向通信。这类消息一般不通过应用程序的消息队列,而是 直接发送到控制对象上。(3)系统消息:对程式化的事件或系统时钟中断作出反应。有些系统消息,例如大部 分 DDE 消息(程序间进行动态数据交换时所使用的消息)要通 过 Windo

39、ws 的系统消息队列。而有些系统消息,例如窗口的创建及删除等消息直接送入应 用程序的消息队列。(4)用户消息:这些消息是程序员创建的,通常,这些消息只从应用程序的某一部分 进入到该应用程序的另一部分而被处理,不会离开应用程序。用户消息经常用来处理选单 操作:一个用户消息与选单中的一选项相对应,当它在应用程 序队列中出现时被处理。Windows 应用程序通过执行一段称为消息循环的代码来轮询应用程序 的消息队列,从 中检索出该程序要处理的消息,并立即将检索到的消息发送到 有关的对象上。典型的 Wind ows 应用程序的消息循环的形式为:MSG msg;while(GetMessage(&msg,

40、NULL,0,0L)1.9、窗口对象 对 Windows 用户和程序员而言,窗口对象(简称窗口)是 一类非常重要的对象。尤其 对程序员,窗口的定义和创建以及对窗口的处理过程最能直观 地反映出 Windows 中面向对 象的程序设计的四个基本机制(类、对象、方法、和消息)。1.9.1 窗口类 如前所述,在程序中创建对象,必须先定义对象所属的类。在 Windows 中,窗口类是 在类型为 WNDCLASS 的结构变量中定义的,在 Windows.h 中,结构类型 WNDCLASS 的说明为:typedef struct tagWNDCLASS DWORD style;/*窗口风格*/WNDPROC

41、*lpfnWndProc;/*窗口函数*/int cbClsExtra;/*类变量占用的存储空间*/int cbWndExtra;/*实例变量占用的存储空间*/HINSTANCE hinstance;/*定义该类的应用程序实例的句柄*/HICON hicon;/*图标对象的句柄*/HCURSOR hCursor;/*光标对象的句柄*/HBRUSH hbrBackground;/*用于擦除用户区的刷子对象的句柄*/LPCSTR lpszMenuName;/*标识选单对象的字符串*/LPCSTR lpszClassName;/*标识该类的名字的字符串*/WNDCLASS;WNDCLASS 类型有十

42、个域,它描述了该类的窗口对 象所具有的公共特征和方法。在程序 中可以定义任意多的窗口类,每个类的窗口对象可以具有不同 的特征。lpszClassName 是 类的名字,在创建窗口对象时用于标识该窗口对象属于哪个类。lpfnWndProc 是指向函数 的一个指针,所指向的函数应具有下述的函数原型:LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lP aram);该函数被称为窗口函数,其中定义了处理发送到该类的窗 口对象的消息的方法。窗口 函数是一个回调函数,因此在定义窗口函数时要使用 CALLLBACK 类

43、型进行说明。参数 hWnd 是一个窗口对象的句柄。通过该句柄,一个窗口函数可以检测 出当前正在处理哪个窗口对 11 TranslateMessage(&msg);DispatchMessage(&msg);函数 GetMessage 从应用程序队列中检索出一条消息,并将它存于具有 MSG 类型的一个 变量中,然后交由函数 TranslateMessage 对该消息进行翻译,紧接着,函数 DispatchMes sage 将消息发送到适当的对象上。有关这三个函数的 更多的细节在 1.10 节里介绍 还有其他一些常量,在后面的章节中介绍有关内容时再进 行讨论。域 lpszMenuName 指向一个

44、以0字符(称为空字符或 NULL 字符)结尾的字符串,用于标识该窗口类的所有对象所使用的缺省选单对象。如果该 域为 NULL,则表示没有缺省 选单。域 hInstance 用于标识定义该窗口类的应用程序的实例句 柄。每一个窗口类需要一个 实例句柄来区分注册窗口类的应用程序或 DLL,该实例句柄用于确定类属。当注册窗口类 的应用程序或 DLL 被终止时,窗口类被删除。WNDCLASS 类型规定了该类窗口对象的基本数据表 示和处理消息的窗口函数,但是,在 有些应用程序中,单有这些是不够的。因此,该类型提供了两 个域 cbClsExtra 及 cbWndEx tra,指示系统分配额外的存储空间用于存

45、储一些附加数据。其中 cbClsExtra 定义可以为 该类的所有对象共用的数据占用的存储空间的大小(以字节计);而 cbWndExtra 用于定义 该类的每个对象私用的数据占用的存储空间的大小(以字节计),一个对象可以在该私有 存储空间中存储一些数据,但该类的其他对象不能访问到这个 对象所存储的这些私用数据。而在公用存储空间中所存的数据可被该类的所有对象访问到。函数 SetClassWord/SetCl assLong 和 GetClassWord/GetClassLong 用于访问公用数据,函数 SetWindowWord/SetWind owLong 和函数 GetWindowWord/

46、GetWindowLong 用于访问特定对象的私用数据,这些函数在“窗口对象”一章讨论。当程序员设置了 WNDCLASS 变量的各个域之后,使用函数 RegisterClass 向 Windows 注 册这个类,至此,完成了定义一个窗口类的过程。函数 RegisterClass 的原型为:BOOL RegisterClass(LPWNDCLASS lpWndClass);该函数唯一的一个参数是指向 WNDCLASS 类型的变量的指针。函数返回非零,表示注册 12 象的消息。参数 message 是消息标识符,参数 wParam 和 lParam 是随同消息一起传送来的 参数,随着消息的不同,这

47、两个参数所表示的含义也不大相同,在定义消息时对这两个参 数的含义一同进行定义。域 hIcon、hCursor 和 hbrBackground 分别定义窗口变成最小时所显示的图标 对象的句 柄,当光标进入该类的窗口对象的显示区域时所显示的光标对 象的句柄,当需要擦除用户 区域显示的消息时所使用的刷子对象的句柄(该刷子作用的结 果形成窗口用户区的背景色)。域 style 规定窗口的风格,它可用下列常量经位或运算之 后形成:类型 说明 CS_HREDRAW 如果窗口的水平尺寸被改变,则重画整个窗口 CS_VREDRAW 如果窗口的垂直尺寸被改变,则重画整个窗口 CS_BYTEALIGNCLIENT

48、在字节边界上(在 X 方向上)定位用户区域的位置 CS_BYTEALIGNWINDOW 在字节边界上(在 X 方向上)定位窗口的位置 CS_DBLCLKS 当连续两次按动鼠标键时向窗口发送该事件的消息 CS_GLOBALCLASS 定义该窗口类是一个全局类。全局类由应用程序或库建立,并且所有的应 用程序均可使用全局类 CS_NOCLOSE 禁止系统选单中的 Close 选项 成功,否则注册失败。不能向 Windows 注册具有相同名字(lpszClassName 域指向相同的 两个字符串)的两个类,否则第二次注册失败并被忽略。下面 是定义和注册窗口类的程序 示例说明:WNDCLASS wndc

49、lass;wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);wndclas

50、s.lpszMenuName=NULL;wndclass.lpszClassName=Window;if(!RegisterClass(&wndclass)./*处理类注册错误*/其中,WndProc 是一个窗口函数名,变量 hInstance 存储着当前程序实例的句柄。Win dows 预定义了一些图标、光标和刷子对象,函数 LoadIcon 返回预定义的应用程序图标的 句柄,该图标由第二个参数 IDI_APPLICATION 来定义。函数 LoadCursor 返回标准箭头光标(IDC_ARROW)的句柄,函数 GetStockObject 返回库存对象中一个白色刷子(WHITE_BRUS

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作报告

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁