Declare Function BitBlt Lib "gdi32" Alias "BitBlt" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
它的参数及其说明如表9-4所示。
表9-4 BitBlt()参数及其说明
|
参 数 |
说 明 |
|
hDestDC |
接受位图的设备 |
|
x |
目标矩形左上角的x坐标 |
|
y |
目标矩形左上角的y坐标 |
|
nWidth |
目标矩形的宽度 |
|
nHeight |
目标矩形的高度 |
|
hSrcDC |
源设备 |
|
xSrc |
源位图左上角的x坐标 |
|
ySrc |
源位图左上角的y坐标 |
|
dwRop |
光栅操作 |
注意:
@ 特别值得一提的是参数dwRop,它提供了源图与目标图的15中组合方式,但是一般的都采用SRCCOPY,即把源图复制给目标图,其余的方式请参阅附录一中的有关内容。
下面就以几个示例从不同的方面介绍Bitblt()函数的应用。
这个应用程序的功能是能够以四种不同的效果动态显示一幅图像,如“飞入效果”、 “两面向中间”、 “从中间扩散”和“拉伸”等效果,具体的步骤如下:
在窗体上添加一个PictureBox控件,它的作用是充当图像动态变换中源图的容器,属性设置如下表9-5所示。
表9-5 控件属性设置
|
属 性 |
设 置 |
|
(Name) |
Picture1 |
|
AutoRedraw |
True |
|
AutoSize |
True |
|
Enabled |
True |
|
Picture |
(Bitmap) |
|
ScaleMode |
1 – Twip |
|
Visible |
False |
其中Picture属性初始化为源图所代表的位图。
在窗体上添加第二个PictureBox控件,作用与第一个PictureBox控件相对应,是充当图像动态变换中目标位图的容器,属性设置如下表9-6所示。
表9-6 属性设置
|
属 性 |
设 置 |
|
(Name) |
Picture2 |
|
AutoRedraw |
False |
|
AutoSize |
False |
|
Enabled |
True |
|
Picture |
(None) |
|
Visible |
True |
由于第二个PictureBox控件作为目标位图的容器,所以它的Picture属性一定要设置为None。
在窗体上添加四个Command控件,在程序的运行过程中单击它们可以触发相应的动态效果,如单击“飞入效果”按钮,就会看到一幅图像从左边飞入PictureBox控件中。
另外还要把一个Timer控件放置到窗体上,用于图像动态显示时延时,它的属性设置如图9-8所示。

图9-8 Timer控件的属性设置
添加控件后的窗体如图9-9所示,其中四个按钮从上到下的名称分别为Command1、Command2、Command3和Command4。

图9-9 添加控件后的窗体
下面以“飞入效果”按钮为例来添加代码,其余动态效果的实现过程请参看后面的源程序代码。在设计阶段双击“飞入效果”按钮,在它的Command1_Click()事件中添加下列代码:
Private Sub Command1_Click()
Picture2.Cls
'单击“飞入效果”按钮,清屏
For I = 0 To W Step 1
BitBlt Picture2.hDC, 0, 0, I, H, Picture1.hDC, W - I, 0, srccopy
'从左面飞入
For g = 0 To 10000 Step 1
Next g
'延时
Next I
End Sub
在程序的运行过程中单击“飞入效果”按钮时,激活了Command1_Click()事件,程序首先通过Picture2.Cls这一条语句清除PictureBox控件上原有的图像,为下面动态显示新的图像作准备。
在Command1_Click()事件的代码段中有一个循环:
For I = 0 To W Step 1
BitBlt Picture2.hDC, 0, 0, I, H, Picture1.hDC, W - I, 0, srccopy
'从左面飞入
Next I
动态显示图像的主要功能都是在这里实现的,“飞入”的效果实现的过程相当于不断的拉着图像从左向右走,而运行时就好象是从左边飞入的一样。此外为了让读者更加清楚的看见“飞入”的效果,在程序中还有一段延时的代码:
For g = 0 To 10000 Step 1
Next g
'延时
技巧:
@ 其实“延时”的功能是通过一个有限次的循环来实现的,加入这段代码完全是为了控制动态显示的速度。
按照上面的方法给各个控件添加相应的代码,其余几个动态效果的实现代码见附后的源程序。
存储文件,按功能间F5运行程序,结果如图9-10所示。

图9-10 运行单击“拉伸效果”按钮时的结果
附源程序代码:
程序清单
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
'声明函数
Private Const srccopy = &HCC0020
'常量的说明
Dim H As Integer
Dim W As Integer
'定义两个全局变量用于存储PictureBox控件的高度和宽度
Dim I As Integer
Dim J As Integer
'定义两个全局变量用于控制循环
Private Sub Command1_Click()
Picture2.Cls
'单击"飞入效果"按钮,清屏
For I = 0 To W Step 1
BitBlt Picture2.hDC, 0, 0, I, H, Picture1.hDC, W - I, 0, srccopy
'从左面飞入
For g = 0 To 10000 Step 1
Next g
'延时
Next I
End Sub
Private Sub Command2_Click()
Picture2.Cls
'单击"两面向中间"按钮,清屏
For I = 0 To W / 2 Step 1
BitBlt Picture2.hDC, I, 0, 1, H, Picture1.hDC, I, 0, srccopy
BitBlt Picture2.hDC, W - I, 0, W, H, Picture1.hDC, W - I, 0, srccopy
'从两面向中间显示
For g = 0 To 10000
Next g
'延时
Next I