二、开门效果
开门效果的制作也是先将Picture1从形式上划分为很多小块a1、a2、a3、…,每块宽度为。如图。
然后利用BitBlt函数先将Picture1中的a0块拷贝到Picture2中的相同位置,等待片刻,再拷贝a1块、a2块、…直到。如果将取得足够小,则人眼看到 Picture2中的图片就是以开门的效果出现的。其程序如下:
Picture2.Cls
nWidth = 3‘小块的宽度,即
Stripes = Picture1.Width / nWidth‘总共的小块数目n个
P2 = Picture1.Height
P1 = nWidth
For I = Picture1.Width / 2 + nWidth To 0 Step -nWidth
p3 = I
p4 = Picture1.Width - I
r% = BitBlt(Form1.Picture2.hDC, p3, 0, P1, P2, Form1.Picture1.hDC, p3, 0, &HCC0020)
r% = BitBlt(Form1.Picture2.hDC, p4, 0, P1, P2, Form1.Picture1.hDC, p4, 0, &HCC0020)
For j = 1 To 8000‘等待片刻,图片开门效果出现的时间可以由此调节
Next
Next
根据同样的方法可以制作“上下开门”、“左右关门”、“上下关门”、“从中间向四周扩大”、“从四周向中间缩小”等效果。
三、百叶窗效果
分成几个大块,每个大块分成很多个小块
如图所示,要将Picture1中的图片拷贝到Picture2中,首先将Picture1从形式上划分为很多宽度为的大块,然后再将每一块进一步划分为宽度为的若干小块。
然后利用BitBlt函数先将Picture1中的a1块拷贝到Picture2中的相同位置,再拷贝b1块、c1块、…5却蹋倏奖碼2块、b2块、c2块、…。如果将取得足够小,则人眼看到 Picture2中的图片就是以百叶窗的效果出现的。其程序如下:
Picture2.Cls
nWidth = 3
mWidth = 18
Stripes = Picture1.Width / nWidth
P2 = Picture1.Height
P1 = nWidth
For j = 0 To mWidth Step nWidth
For I = 0 To Picture1.Width + nWidth Step mWidth
p3 = I + j
r% = BitBlt(Form1.Picture2.hDC, p3, 0, P1, P2, Form1.Picture1.hDC, p3, 0, &HCC0020)
Next
For k = 1 To 200000
Next
Next
根据同样的道理,可以制作上下百叶窗效果。
四、逐段翻开效果
分成几个大块,每个大块分成很多个小块
如图所示,要将Picture1中的图片拷贝到Picture2中,首先将Picture1从形式上划分为很多宽度为的大块,然后再将每一块进一步划分为宽度为的若干小块。
然后利用BitBlt函数先将Picture1中的a0块拷贝到Picture2中的相同位置,再拷贝a1块、a2块、…。等待片刻,再拷贝b0块、b1块、b2块、…。如果将取得足够小,则人眼看到 Picture2中的图片就是以逐段翻开的效果出现的。其程序如下:
stripewidth = 40
Stripes = Picture1.ScaleWidth / stripewidth
P2 = Picture1.ScaleHeight
For i = 0 To (Stripes - 1) / 10 Step 1
For m = 0 To stripewidth / 2
r% = BitBlt(Picture2.hDC, P1 + m + stripewidth / 2 + i * stripewidth, 0, 2, P2, Picture1.hDC, P1 + m + stripewidth / 2 + i * stripewidth, 0, &HCC0020)
r% = BitBlt(Picture2.hDC, P1 - m + stripewidth / 2 + i * stripewidth, 0, 2, P2, Picture1.hDC, P1 - m + stripewidth / 2 + i * stripewidth, 0, &HCC0020)
For j = 1 To 10000
Next j
Next m
For j = 1 To 50000
Next j
Next i
五、逐段进入效果
将Picture1从形式上划分为很多宽度为的大块
a1块在Picture2中的位置
a1块在Picture2中的位置前进了
逐段进入效果的制作要麻烦一些,要将Picture1中的图片拷贝到Picture2中,首先将Picture1从形式上划分为很多宽度为的大块a1、a2、a3、…。
利用BitBlt函数先将Picture1中的a1块拷贝到Picture2中的最右边,如图(2),等待片刻,将Picture2中的图片清除掉,然后将Picture1中的a1块拷贝到Picture2中的距离最右边处。如图(3),a1块好象向左前进了,如此下去,就可以实现a1块从左进入,使用同样的办法使a2块、a3块、…依次逐渐进入。这样,人眼看到 Picture2中的图片就是以逐段进入的效果出现的。其程序如下:
Picture2.Cls
nWidth = 50
Stripes = Picture1.Width / nWidth
P2 = Picture1.Height
P1 = nWidth
For I = 0 To Picture1.Width + nWidth Step nWidth
p3 = I
For k = Picture1.Width To I Step -nWidth
p4 = k
Picture2.Cls
r% = BitBlt(Picture2.hDC, 0, 0, I, P2, Picture1.hDC, 0, 0, &HCC0020)
r% = BitBlt(Picture2.hDC, p4, 0, P1, P2, Picture1.hDC, p3, 0, &HCC0020)
For j = 1 To 300000 注释:Wait For A While
Next j
Next k
Next i
必须指出,以上逐段进入的效果有一个明显的缺点,就是有“闪动”现象。产生这种现象的原因是由于程序不停地删除、不停地拷贝同一块造成的。如果不删除而只拷贝,则不会出现“闪动”现象。
六、马赛克效果
马赛克效果在很多软件中都有应用,其原理是将Picture1从形式上划分为很多小块,如图所示,一共有n块。然后利用BitBlt函数将Picture1中的小块随机地拷贝到Picture2中的相同位置处。
你不能简单地产生一个随机数,然后将这个随机数的值所对应的那一小块图片拷到Picture2中。因为随机数是随机的,所以有可能某些数重复出现,而某些数很久甚至始终未出现。这就造成Picture2中有些块被重复拷贝,而有些块始终未出现。另外,在随机拷贝的后阶段,随机数与以前重复的概率越来越大,这就造成新块出现的时间越来越慢,达不到理想的马赛克效果。
解决的办法是先产生一个随机系列。用一维数组 B(n)记录n个随机值,每一个随机值都在n以内,且各不相同。然后按顺序将B(n)中的随机值读出,并根据这个随机值拷贝对应的图片块。这样,新块出现的速度才能做到均匀,而且保证每个图片块都能出现,从而达到非常完美的马赛克效果。
Dim A(0 To 1000) As Integer
Dim B(0 To 400) As Integer
Dim S1, S2 As Integer
Picture2.Cls
注释:产生随机数组
For I = 0 To 1000
A(I) = 0
Next
For I = 0 To 400
Loop1: k = Int(Rnd() * 1000) + 1
If Not (A(k) = 0) Then GoTo Loop1
A(k) = I
Next
For I = 0 To 1000
If Not (A(I) = 0) Then
B(V1) = A(I)
V1 = V1 + 1
End If
Next
‘根据随机数组的值,拷贝小图片
S1 = Picture1.Width / 20
S2 = Picture1.Height / 20
For I = 0 To 400
k2 = B(I) Mod 20
k1 = ((Int(B(I)) - k2) / 20) * S2
k2 = k2 * S1
r% = BitBlt(Picture2.hDC, k2, k1, S1 + 2, S2 + 2, Picture1.hDC, k2, k1, &HCC0020)
For j = 1 To 5000 注释:wait
Next
Next
以上程序在WIN95,VB4中运行通过,在VB3,VB5,VB6中梢加修改,也可以运行通过。图片出现的效果还有很多,限于篇幅所限,就不在这里叙述了。只要你灵活地应用以上方法,一定还能产生更多更美的图片出现效果。这些风格各异的图片出现效果必定会为您的Visual Basic程序增添美丽的情调,使您的程序更富魅力、更具专业。  
2/2 首页 上一页 1 2 |