第一、With 语句介绍
在一个单一对象或一个用户定义类型上执行一系列的语句。
语法
With object
[statements]
End With
With 语句的语法具有以下几个部分:
部分 描述
object 必要参数。一个对象或用户自定义类型的名称。
statements 可选参数。要执行在 object 上的一条或多条语句。
说明
With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。例如,要改变一个对象的多个属性,可以在 With 控制结构中加上属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它。下面的例子显示了如何使用 With 语句来给同一个对象的几个属性赋值。
注意 当程序一旦进入 With 块,object 就不能改变。因此不能用一个 With 语句来设置多个不同的对象。
可以将一个 With 块放在另一个之中,而产生嵌套的 With 语句。但是,由于外层 With 块成员会在内层的 With 块中被屏蔽住,所以必须在内层的 With 块中,使用完整的对象引用来指出在外层的 With 块中的对象成员。
重点 一般来说,建议不要跳入或跳出 With 块。如果在 With 块中的语句被执行,但是 With 或 End With 语句并没有执行,则一个包含对该对象引用的临时变量将保留在内存中,直到您退出该过程。
第二、bmp位图的dib的结构
在windows3.0以前,windows系统用的是ddb(设备有关位图),ddb没有调色板,显示的颜色依赖硬件,处理色彩很不方便。所以微软从windows3.0以后重新定义了bmp文件格式,使其支持设备无关位图--也就是dib,其结构主要由以下几个部分构成:1)bitmapfileheader:bmp文件头;2)dibbitmapinfoheader:bmp位图文件信息头;3)rgbquad[]:bmp位图的调色板;4)位图数据块。bmp文件的结构示意图如图一所示:
图一、位图文件的结构示意图
(1)bmp位图文件头bitmapfileheader的vb声明如下:
typebitmapfileheader
bftype(0to1)asbyte
bfsizeaslong
bfreserved1asinteger
bfreserved2asinteger
bfoffbitsaslong
endtype
上述结构中,参数bftype指示文件的类型,对于位图文件来说,它必须是bm;参数bfsize指示位图文件的大小,它包括bitmapfileheader的长度;参数bfreserved1、bfreserved2目前保留,必须等于0;参数bfoffbits表示位图数据距离文件头的偏移字节数。
(2)文件信息头bitmapinfoheader结构在vb中声明如下:
typebitmapinfoheader
bisizeaslong
biwidthaslong
biheightaslong
biplanesasinteger
bibitcountasinteger
bicompressionaslong
bisizeimageaslong
bixpelspermeteraslong
biypelspermeteraslong
biclrusedaslong
biclrimportantaslong
endtype
上述结构中,参数bisize表示bitmapinfoheader结构的大小;参数biwidth表示位图的高度,单位是像素;参数biheight位图的宽度,单位是像素;参数biplanes设备的位平面数,现在都是1;参数bibitcount图像的颜色位数,1表示单色位图、4表示16色位图、8表示256色位图、24表示真彩色位图、32表示32位位图,默认情况下windows不会处理最高8位,可以将它作为自己的alpha通道;参数bicompression表示图像的压缩方式,bi_rgb表示无压缩、bi_rle8表示行程编码压缩;参数bisizeimage表示实际的位图数据所占字节;参数bixpelspermeter表示目标设备的水平分辨率,单位是每米的像素个数;参数biypelspermeter表示目标设备的垂直分辨率,单位是每米的像素个数;参数biclrused表示使用的颜色数(当bibitcount等于1、4、8时才有效),如果该项为0,表示颜色数为2^bibitcount;参数biclrimportant#重要的颜色数,如果该项为0,表示所有颜色都是重要的。
(3)位图调色板
调色板实际上是一个数组,它的元素的个数由bibitcount和biclrused决定,对于位图文件来说,只有bibitcount等于1、4、8时才有调色板,它们对应的调色板的元素个数分别是2、16、256。调色板结构在vb中的声明如下:
privatetypergbquad
rgbblueasbyte
rgbgreenasbyte
rgbredasbyte
rgbreservedasbyte
endtype
上述结构中,参数rgbblue表示蓝色分量,参数rgbgreen绿色分量;参数rgbred表示红色分量;参数rgbreserved为保留位,设置为0既可。对于各个颜色的分量来说,它们分布在0-255之间,数值越大,亮度越大,反之则亮度越小。
需要说明的是,bitmapinfoheader结构和调色板数据合在一起就构成了bitmapinfo结构,这个结构在显示位图文件时能够用到。该结构在vb中声明如下:
privatetypebitmapinfo
bmiheaderasbitmapinfoheader
bmicolors(0to255)asrgbquad
endtype
(4)位图数据
对于位图文件来说,一行的图像数据叫做一个扫描行,一个扫描行的长度必须是4的倍数(字节),如果不是,则需要补齐。计算公式:linebytes=((biwidth*bibitcount+31)and&hffffffe0)/8,通常情况下dib的扫描行是逆序存储的(相对于屏幕坐标系而言),即屏幕上的第一行是dib位图数据的最后一行。对于256色位图来说,它用8bit表示一个像素的颜色索引,也就是说,位图显示时,根据当前索引值来到位图的调色板中确定该像素的颜色;对于真彩色图象来说,位图文件中没有调色板信息,它直接用24个bit位表示一个像素的颜色,每个字节表示一种基色,也就是r、g、b分量中的一个值,需要注意的是,真彩色位图文件中三个字节的排列顺序是bgr,而不是传统的rgb。
第三、with语句定义BITMAPINFO变量
Dim bmp_info As BITMAPINFO
With bmp_info.bmiHeader
.biSize = LenB(bmp_info.bmiHeader)
.biWidth = nWidth'参数biwidth表示位图的高度,单位是像素
.biHeight = nHeight'biheight位图的宽度,单位是像素
.biPlanes = 1
.biBitCount = 24
.biCompression = BI_RGB
.biSizeImage = nBufSize
End With
With bmp_info.bmiColors .rgbBlue = 128 .rgbGreen = 128 .rgbRed = 128End With