API完成圓滿的圖片出現效果
發表時間:2024-06-20 來源:明輝站整理相關軟件相關文章人氣:
[摘要]作者:羅玉強 在用Visual Basic編程的時候,通常要調用圖片,如果圖片出現的時候是以各種完美的效果出現的,(如馬賽克效果,百葉窗效果等)則你的程序就會顯得更加靈活,你的程序就會更加專業化。本文講述了Visual Basic中如何調用API函數,以及用API函數中的BitBlt函數實現各種完...
作者:羅玉強
在用Visual Basic編程的時候,通常要調用圖片,如果圖片出現的時候是以各種完美的效果出現的,(如馬賽克效果,百葉窗效果等)則你的程序就會顯得更加靈活,你的程序就會更加專業化。本文講述了Visual Basic中如何調用API函數,以及用API函數中的BitBlt函數實現各種完美的圖片出現效果的過程。
§1 一般的圖片出現效果
一般情況下,要使Visual Basic中的圖片出現,例如,要顯示Picture1中的圖片,只需一句代碼:
Picture1.Visible=True
使用以上方法時,圖片是突然出現的。也可以編復雜一點的代碼,使圖片從左到右、從上到下或從中間向四周擴大。例如,使Picture1中的圖片從左到右出現,其代碼為:
Picture1.Width = 0
Picture1.Visible = True
For i = 0 To 5000 Step 50 注釋:5000代表圖片的高度
Picture1.Width = i
Next i
使Picture1中的圖片從上到下出現的代碼為:
Picture1.Height = 0
Picture1.Visible = True
For i = 0 To 4000 Step 40 注釋:4000代表圖片的寬度
Picture1.Height = i
Next i
使Picture1中的圖片從中間向四周擴大的代碼為:
Picture1.Width = 0
Picture1.Height = 0
Picture1.Visible = True
For i = 0 To 100
Picture1.Width = Picture1.Width + 50
Picture1.Height = Picture1.Height + 40
Picture1.Left = Picture1.Left - 100
Picture1.Top = Picture1.Top - 80
Next i
當然,你可以靈活地應用以上辦法實現其他更加好看的圖片出現效果。然而,同Authorware等其他軟件編制的程序相比,你的圖片出現效果仍然會黯然失色,因為Authorware編程時,可以很容易地實現從上到下、從左到右、百葉窗、開門、關門等完美的圖片出現效果,要在Visual Basic中做到這些效果并非易事。
但“天無絕人之路”,強大的Windows API函數中的BitBlt函數將幫助您實現這一愿望。
§2 BitBlt函數
一、 BitBlt函數的功能
BitBlt API函數的功能是將屏幕上任何一塊拷貝到屏幕上其它任何一個地方。
二、 聲明BitBlt函數
1. 運行Visual Basic4.0程序組中的API Text Viewer程序項。
2. 在API Text Viewer中,單擊File菜單下的Load Text File...命令。
3. 在出現的Select a Text API File對話框中,選擇Win32api.txt文件。
4. 為了使以后拷貝Windows API函數更快,你可以將Win32api.txt文件轉換成為一個數據庫。如圖,單擊“是(Y)”。
5. 在API Type下拉框中選擇Declare。
6. 在Available Items中選擇BitBlt,如圖,單擊Add按紐,于是BitBlt便出現在Selected Items框中,單擊Copy按紐。BitBlt函數變拷貝到剪貼板上。
7. 關閉API Text Viewer,打開Visual Basic程序,使用Insert菜單下的Module命令新建一個Module1,使用Edit菜單下的Paste命令,將剪貼板上的BitBlt函數拷貝到Module1中。這樣,在您的程序中,就可以使用BitBlt函數了。
三、BitBlt函數中各參數簡介
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
以上是BitBlt函數的聲明格式,其中,各參數定義如下:
參數
描述
hDestDC
接收位圖的設備描述表
X
目標矩形左上角的邏輯X坐標
Y
目標矩形左上角的邏輯Y坐標
nWidth
目標矩形的寬度
nHeight
目標矩形的高度
hSrcDC
源設備描述表
xSrc
源位圖左上角的邏輯X坐標
ySrc
源位圖左上角的邏輯Y坐標
dwRop
拷貝模式
dwRop的各種可能值為:
&HCC0020
dest=source
&HEE0086
dest=source OR dest
&H8800C6
dest=source AND dest
&H660046
dest=source XOR dest
&H440328
dest=source AND (NOT dest)
&H330008
dest=not source
&H1100A6
dest=(NOT source)AND(NOT dest)
&HC000CA
dest=source AND pattern
&HBB0226
dest=(NOT source) OR dest
&HF00021
dest=pattern
&HFB0A09
dest=Dpsnoo
&H5A0049
dest=pattern XOR dest
&H550009
dest=NOT dest
&H42&
dest=BLACK
&HFF0062
dest=WHITE
在本程序中使用的BitBlt函數均定義dwRop=HCC0020,如果你定義dwRop為其他值,會收到其他異想不到的效果。
§3 用BitBlt函數實現各種各樣的圖片出現效果
實現髦滯計魷中Ч幕駒硎牽荷柚昧礁鐾計騊icture1和Picture2,在Picture1中裝入要顯示的圖片,(可以在窗體設計時就裝好,也可以在程序運行過程中裝入。)將Picture1中的圖片以各種方法拷貝到Picture2中,從而實現各種各樣的圖片出現效果。
先在Picture1中裝入待顯示的圖片,并設置Picture1的屬性為AutoRedraw=True,Visible=False, 設置Picture2的屬性為AutoRedraw=False,Visible=True,設置Form的屬性為ScaleMode=3。
一、從上到下效果
將Picture1從形式上分為很多小塊
如圖所示,要將Picture1中的圖片拷貝到Picture2中,首先將Picture1從形式上劃分為很多小塊a1、a2、a3、…,每塊寬度為。
然后利用BitBlt函數先將Picture1中的a1塊拷貝到Picture2中的相同位置,等待片刻,再拷貝a2塊、a3塊、…直到。如果將取得足夠小,則人眼看到 Picture2中的圖片就是以從上到下的效果出現的。其程序如下:
Picture2.Cls
nHeight = 3‘小塊的高度,即
Stripes = Picture1.Height / nHeight‘總共的小塊數目n個
P2 = nHeight
P1 = Picture1.Width
For I = 0 To Picture1.Height Step nHeight
p3 = I
r% = BitBlt(Form1.Picture2.hDC, 0, p3, P1, P2, Form1.Picture1.hDC, 0, p3, &HCC0020)
For j = 1 To 8000 注釋:‘等待片刻,圖片從上到下出現的時間可以由此調節
Next
Next
明白了以上制作原理以后,圖片從下到上、從做到右、從右到左出現的效果也就可以實現了。
二、開門效果
開門效果的制作也是先將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程序增添美麗的情調,使您的程序更富魅力、更具專業。