结构是C和C++语言中的说法。在VB中一般称为自定义数据类型。想必很多朋友都已经认识它。在API领域里,我更喜欢把它叫做结构,因为API各种结构类型根本不是我定义( 自定义)的。 在VB中,API结构同样由TYPE.......END TYPE语句来定义。如,在API中,点(Point)结构的定义方法如下: Public Type POINTAPI X As Long '点在X坐标(横坐标)上的坐标值 Y As Long '点在Y坐标(纵坐标)上的坐标值 End Type 又如,API中矩形(Rect)结构的定义如下∶ Public Type RECT Left As Long '矩形左上角的X坐标 Top As Long '矩形左上角的Y坐标 Right As Long '矩形右下角的X坐标 Bottom As Long '矩形右下角的Y坐标 End Type 这些内容同样可以从API文本游览器中拷贝过来。这些结构中的变量名可随意改动,而不会影响结构本身。也就是说,这些成员变量都是虚拟的。如,POINTAPI结构可改为如下∶ Public Type POINTAPI MyX As Long '点在X坐标(横坐标)上的坐标值 MyY As Long '点在Y坐标(纵坐标)上的坐标值 End Type 不过,一般来讲,是没有这种必要的。结构本身是一种数据类型,因此,使用时必须声明具体变量为该结构型,才能在程序中真正使用到该结构。结构的声明方法和其他数据的声明方法一样,如,以下语句把变MyPoint声明为POINTAPI结构类型∶ MyPoint As POINTAPI 引用结构中的成员变量也十分简单,在结构名后面加上一个".",然后紧接着写要引用的成员变量即可。这很象VB中的引用一个对象的某个属性。如,假如我们把上面已经声明的MyPoint结构中的X变量的值赋给变量Temp& 则代码如下∶ Temp&=MyPoint.X 但,特别注意的是,你千万不要认为上例中的MyPoint是一个值。它不是值,而是地址( 指针)。值和地址是完全不同的概念。结构要求按引用传递给WINDOWS函数,即所有API 函数中,结构都是按ByRef传递的(在Declare语句 中ByRef是默认型)。对于结构的传递,你不要试图采用ByVal,你将一无所获。由于结构名实际上就是指向这个结构的指针(这个结构的首地址),所以,你也就传送特定的结构名就可以了(参见小结,我用红色字体来突出了这种传递方式)。 由于结构传送的是指针,所以函数将直接对结构进行读写操作。这种特性很适合于把函数执行的结果装载在结构之中。
|