1.5、句柄 Windows应用程序中存在许多对象,例如选单、窗口、图标、内存对象、位图、刷子、设备对象和程序实例等,在Windows中,对象使用句柄进行标识,这样,通过使用一个句柄,应用程序可以访问一个对象。 在Windows软件开发工具中,句柄被定义为一种新的数据类型。在应用程序中,对句柄的使用一般只有赋值(句柄可以被赋以初始值、被改变为用于标识同类对象中的另一个对象和被用作函数的参数)、与NULL进行相等比较(判定一个句柄是否为一个有效的句柄)和与标识同类对象的另一个句柄进行相等比较(判定两个句柄是否标识同一个对象),没有其它的运算。虽然在有的书中介绍说句柄是一个十六位的整数,但实际情况并不这样简单,它的长度将会随着不同的计算机平台和Windows的发展而有所变化,例如,在32位Windows中,句柄将是一个32位的数据,并且不是整数类型。 一种通用句柄类型为HANDLE,在Windows 3.1以前的版本中,它可被用于标识所有种类的对象,在Windows 3.1中,部分地保留了这一特点,在本教程的程序中也有所反映。在Windows 3.1中,从HANDLE类型又派生出了一些新的句柄数据类型,每种类型的句柄用于标识一种类型的对象,下面是一些常见的句柄类型:
类型 | 说明 | HANDLE | 通用句柄类型 | HWND | 标识一个窗口对象 | HDC | 标识一个设备对象 | HMENU | 标识一个选单对象 | HICON | 标识一个图标对象 | HCURSOR | 标识一个光标对象 | HBRUSH | 标识一个刷子对象 | HPEN | 标识一个笔对象 | HFONT | 标识一个字体对象 | HINSTANCE | 标识一个应用程序模块的一个实例 | HLOCAL | 标识一个局部内存对象 | HGLOBAL | 标识一个全局内存对象 |
1.6、数据类型及常量 为便于开发Windows应用程序,Windows的开发者新定义了一些数据类型。这些数据类型或是与C/C++中已有的数据类型同义,或是一些新的结构数据类型。引入这些类型的主要目的是为便于程序员开发Windows应用程序,同时也是为了增强程序的可读性;另一个目的是为了便于程序将来能被移植到其它种类的计算机平台上或适应Windows将来的新版本的变化。例如,本教程目前使用16位API(Application Program Interface),现在Windows的版本使用32位API,只要将HANDLE等句柄类型定义为32位长,然后重新编译程序,就可以很方便地将一个使用16位API的Windows应用程序改为使用32位API的程序,使其能运行在32位API Windows上。大部分的数据类型在Windows.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 (PASCAL FAR * FARPROC)();
在Windows.h中,使用typedef还定义了一些新的结构类型。这些结构类型的名字也使用大写形式的标识符:
类型 | 说明 | MSG | 消息结构 | WNDCLASS | 窗口的类的结构 | PAINTSTRUCT | 绘图结构 | POINT | 点的坐标的结构 | RECT | 矩形结构 |
我们在这里以类型MSG为例来说明类型的定义方法,对于其它类型,在以后用到时再作详细地说明。类型MSG是一个消息结构,它的定义方式及其各域的含义如下:
typedef struct tagMSG { HWND hWnd; // 窗口对象的标识符,该条消息传递到它所标识的窗口上 UINT message; // 消息标识符,标识某个特定的消息 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在定义大部分类型的同时,还定义了该类型的指针类型。例如,上例中的LPPOINT和LPMSG等,其中字母前缀LP表示远指针类型;若使用NP作为一个类型的前缀,则表示近指针类型;若使用P作为一个类型的前缀时,则表示一般的指针类型,这时由编译程序时所使用的内存模块决定这种指针是远指针或是近指针。在Windows.h中说明的大部分指针类型都采用这里介绍的方法进行说明,例如,LPRECT,它表示一个RECT类型的远指针。 在Windows.h中说明的大部分指针类型使用了C/C++的关键字const,如果一个指针类型的名字前缀为LPC、NPC或PC,则其中的字母C表示这种类型的指针变量所指向的变量不能通过该指针变量来修改,这种指针类型一般采用下述方法进行说明:
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 lpPoint ; fun(lpPoint) ;
编译器将指示这个函数调用语句是错误的。所以,在一个函数不修改一个指针参数所指向的变量的情况下,最好将该参数说明为const指针,使const类型的指针也能用于该函数的参数。Windows.h中说明的大部分函数使用了const指针参数。 在Windows.h中,大多数语句是用于定义一个常量,例如:
#denfine WM_QUIT 0X0012
该语句用标识符WM_QUIT来表示编号为0X0012的消息。每个常量由一个前缀和表示其含义的单词组成的标识符组成,两者之间用下画线隔开。前缀表明这些常量所属的一般范畴。下面是一些前缀和它们所属的范畴的说明。
类型 | 说明 | CS | 窗口类的风格(Class Style) | IDI | 预定义的图标对象的标识符(IDentity of Icon) | IDC | 预定义的光标对象的标识符(IDentity of Cursor) | WS | 窗口的风格(Windows Style) | CW | 创建窗口(Create Windows) | WM | 窗口消息(Windows Message) | DT | 绘制文本(Drawing Text) |
在变量名的表示方法方面,Windows推荐使用一种称为“匈牙利表示法”的方法。每个变量名用小写字母或描述了变量的数据类型的字母作为前缀,变量的名字紧跟其后,且用大写字母开始的单词(一个或多个单词)表示其含义,这样每个变量都能附加上其数据类型的助记符。例如:
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,用于表示X坐标时 | y | short,用于表示Y坐标时 |
Windows程序员也可以根据上述思想和使用目的,发明一些其他的前缀,但要注意,对这些前缀的使用必须保持前后一致。在Windows中,所有的函数根据其用途来命名,它们一般由2到3个英文单词组成,每个单词的第一个字母大写,例如,函数CreateWindow(),由该函数的名字可以知道它的用途是创建一个窗口。
 
2/2 首页 上一页 1 2 |