API完成圓滿的圖片出現(xiàn)效果
發(fā)表時間:2024-02-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]作者:羅玉強 在用Visual Basic編程的時候,通常要調(diào)用圖片,如果圖片出現(xiàn)的時候是以各種完美的效果出現(xiàn)的,(如馬賽克效果,百葉窗效果等)則你的程序就會顯得更加靈活,你的程序就會更加專業(yè)化。本文講述了Visual Basic中如何調(diào)用API函數(shù),以及用API函數(shù)中的BitBlt函數(shù)實現(xiàn)各種完...
作者:羅玉強
在用Visual Basic編程的時候,通常要調(diào)用圖片,如果圖片出現(xiàn)的時候是以各種完美的效果出現(xiàn)的,(如馬賽克效果,百葉窗效果等)則你的程序就會顯得更加靈活,你的程序就會更加專業(yè)化。本文講述了Visual Basic中如何調(diào)用API函數(shù),以及用API函數(shù)中的BitBlt函數(shù)實現(xiàn)各種完美的圖片出現(xiàn)效果的過程。
§1 一般的圖片出現(xiàn)效果
一般情況下,要使Visual Basic中的圖片出現(xiàn),例如,要顯示Picture1中的圖片,只需一句代碼:
Picture1.Visible=True
使用以上方法時,圖片是突然出現(xiàn)的。也可以編復(fù)雜一點的代碼,使圖片從左到右、從上到下或從中間向四周擴大。例如,使Picture1中的圖片從左到右出現(xiàn),其代碼為:
Picture1.Width = 0
Picture1.Visible = True
For i = 0 To 5000 Step 50 注釋:5000代表圖片的高度
Picture1.Width = i
Next i
使Picture1中的圖片從上到下出現(xiàn)的代碼為:
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
當然,你可以靈活地應(yīng)用以上辦法實現(xiàn)其他更加好看的圖片出現(xiàn)效果。然而,同Authorware等其他軟件編制的程序相比,你的圖片出現(xiàn)效果仍然會黯然失色,因為Authorware編程時,可以很容易地實現(xiàn)從上到下、從左到右、百葉窗、開門、關(guān)門等完美的圖片出現(xiàn)效果,要在Visual Basic中做到這些效果并非易事。
但“天無絕人之路”,強大的Windows API函數(shù)中的BitBlt函數(shù)將幫助您實現(xiàn)這一愿望。
§2 BitBlt函數(shù)
一、 BitBlt函數(shù)的功能
BitBlt API函數(shù)的功能是將屏幕上任何一塊拷貝到屏幕上其它任何一個地方。
二、 聲明BitBlt函數(shù)
1. 運行Visual Basic4.0程序組中的API Text Viewer程序項。
2. 在API Text Viewer中,單擊File菜單下的Load Text File...命令。
3. 在出現(xiàn)的Select a Text API File對話框中,選擇Win32api.txt文件。
4. 為了使以后拷貝Windows API函數(shù)更快,你可以將Win32api.txt文件轉(zhuǎn)換成為一個數(shù)據(jù)庫。如圖,單擊“是(Y)”。
5. 在API Type下拉框中選擇Declare。
6. 在Available Items中選擇BitBlt,如圖,單擊Add按紐,于是BitBlt便出現(xiàn)在Selected Items框中,單擊Copy按紐。BitBlt函數(shù)變拷貝到剪貼板上。
7. 關(guān)閉API Text Viewer,打開Visual Basic程序,使用Insert菜單下的Module命令新建一個Module1,使用Edit菜單下的Paste命令,將剪貼板上的BitBlt函數(shù)拷貝到Module1中。這樣,在您的程序中,就可以使用BitBlt函數(shù)了。
三、BitBlt函數(shù)中各參數(shù)簡介
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函數(shù)的聲明格式,其中,各參數(shù)定義如下:
參數(shù)
描述
hDestDC
接收位圖的設(shè)備描述表
X
目標矩形左上角的邏輯X坐標
Y
目標矩形左上角的邏輯Y坐標
nWidth
目標矩形的寬度
nHeight
目標矩形的高度
hSrcDC
源設(shè)備描述表
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函數(shù)均定義dwRop=HCC0020,如果你定義dwRop為其他值,會收到其他異想不到的效果。
§3 用BitBlt函數(shù)實現(xiàn)各種各樣的圖片出現(xiàn)效果
實現(xiàn)髦滯計魷中Ч幕駒硎牽荷柚昧礁鐾計騊icture1和Picture2,在Picture1中裝入要顯示的圖片,(可以在窗體設(shè)計時就裝好,也可以在程序運行過程中裝入。)將Picture1中的圖片以各種方法拷貝到Picture2中,從而實現(xiàn)各種各樣的圖片出現(xiàn)效果。
先在Picture1中裝入待顯示的圖片,并設(shè)置Picture1的屬性為AutoRedraw=True,Visible=False, 設(shè)置Picture2的屬性為AutoRedraw=False,Visible=True,設(shè)置Form的屬性為ScaleMode=3。
一、從上到下效果
將Picture1從形式上分為很多小塊
如圖所示,要將Picture1中的圖片拷貝到Picture2中,首先將Picture1從形式上劃分為很多小塊a1、a2、a3、…,每塊寬度為。
然后利用BitBlt函數(shù)先將Picture1中的a1塊拷貝到Picture2中的相同位置,等待片刻,再拷貝a2塊、a3塊、…直到。如果將取得足夠小,則人眼看到 Picture2中的圖片就是以從上到下的效果出現(xiàn)的。其程序如下:
Picture2.Cls
nHeight = 3‘小塊的高度,即
Stripes = Picture1.Height / nHeight‘總共的小塊數(shù)目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 注釋:‘等待片刻,圖片從上到下出現(xiàn)的時間可以由此調(diào)節(jié)
Next
Next
明白了以上制作原理以后,圖片從下到上、從做到右、從右到左出現(xiàn)的效果也就可以實現(xiàn)了。
二、開門效果
開門效果的制作也是先將Picture1從形式上劃分為很多小塊a1、a2、a3、…,每塊寬度為。如圖。
然后利用BitBlt函數(shù)先將Picture1中的a0塊拷貝到Picture2中的相同位置,等待片刻,再拷貝a1塊、a2塊、…直到。如果將取得足夠小,則人眼看到 Picture2中的圖片就是以開門的效果出現(xiàn)的。其程序如下:
Picture2.Cls
nWidth = 3‘小塊的寬度,即
Stripes = Picture1.Width / nWidth‘總共的小塊數(shù)目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‘等待片刻,圖片開門效果出現(xiàn)的時間可以由此調(diào)節(jié)
Next
Next
根據(jù)同樣的方法可以制作“上下開門”、“左右關(guān)門”、“上下關(guān)門”、“從中間向四周擴大”、“從四周向中間縮小”等效果。
三、百葉窗效果
分成幾個大塊,每個大塊分成很多個小塊
如圖所示,要將Picture1中的圖片拷貝到Picture2中,首先將Picture1從形式上劃分為很多寬度為的大塊,然后再將每一塊進一步劃分為寬度為的若干小塊。
然后利用BitBlt函數(shù)先將Picture1中的a1塊拷貝到Picture2中的相同位置,再拷貝b1塊、c1塊、…5卻,再开劥a2塊、b2塊、c2塊、…。如果將取得足夠小,則人眼看到 Picture2中的圖片就是以百葉窗的效果出現(xiàn)的。其程序如下:
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
根據(jù)同樣的道理,可以制作上下百葉窗效果。
四、逐段翻開效果
分成幾個大塊,每個大塊分成很多個小塊
如圖所示,要將Picture1中的圖片拷貝到Picture2中,首先將Picture1從形式上劃分為很多寬度為的大塊,然后再將每一塊進一步劃分為寬度為的若干小塊。
然后利用BitBlt函數(shù)先將Picture1中的a0塊拷貝到Picture2中的相同位置,再拷貝a1塊、a2塊、…。等待片刻,再拷貝b0塊、b1塊、b2塊、…。如果將取得足夠小,則人眼看到 Picture2中的圖片就是以逐段翻開的效果出現(xiàn)的。其程序如下:
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函數(shù)先將Picture1中的a1塊拷貝到Picture2中的最右邊,如圖(2),等待片刻,將Picture2中的圖片清除掉,然后將Picture1中的a1塊拷貝到Picture2中的距離最右邊處。如圖(3),a1塊好象向左前進了,如此下去,就可以實現(xiàn)a1塊從左進入,使用同樣的辦法使a2塊、a3塊、…依次逐漸進入。這樣,人眼看到 Picture2中的圖片就是以逐段進入的效果出現(xiàn)的。其程序如下:
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
必須指出,以上逐段進入的效果有一個明顯的缺點,就是有“閃動”現(xiàn)象。產(chǎn)生這種現(xiàn)象的原因是由于程序不停地刪除、不停地拷貝同一塊造成的。如果不刪除而只拷貝,則不會出現(xiàn)“閃動”現(xiàn)象。
六、馬賽克效果
馬賽克效果在很多軟件中都有應(yīng)用,其原理是將Picture1從形式上劃分為很多小塊,如圖所示,一共有n塊。然后利用BitBlt函數(shù)將Picture1中的小塊隨機地拷貝到Picture2中的相同位置處。
你不能簡單地產(chǎn)生一個隨機數(shù),然后將這個隨機數(shù)的值所對應(yīng)的那一小塊圖片拷到Picture2中。因為隨機數(shù)是隨機的,所以有可能某些數(shù)重復(fù)出現(xiàn),而某些數(shù)很久甚至始終未出現(xiàn)。這就造成Picture2中有些塊被重復(fù)拷貝,而有些塊始終未出現(xiàn)。另外,在隨機拷貝的后階段,隨機數(shù)與以前重復(fù)的概率越來越大,這就造成新塊出現(xiàn)的時間越來越慢,達不到理想的馬賽克效果。
解決的辦法是先產(chǎn)生一個隨機系列。用一維數(shù)組 B(n)記錄n個隨機值,每一個隨機值都在n以內(nèi),且各不相同。然后按順序?qū)(n)中的隨機值讀出,并根據(jù)這個隨機值拷貝對應(yīng)的圖片塊。這樣,新塊出現(xiàn)的速度才能做到均勻,而且保證每個圖片塊都能出現(xiàn),從而達到非常完美的馬賽克效果。
Dim A(0 To 1000) As Integer
Dim B(0 To 400) As Integer
Dim S1, S2 As Integer
Picture2.Cls
注釋:產(chǎn)生隨機數(shù)組
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
‘根據(jù)隨機數(shù)組的值,拷貝小圖片
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中梢加修改,也可以運行通過。圖片出現(xiàn)的效果還有很多,限于篇幅所限,就不在這里敘述了。只要你靈活地應(yīng)用以上方法,一定還能產(chǎn)生更多更美的圖片出現(xiàn)效果。這些風格各異的圖片出現(xiàn)效果必定會為您的Visual Basic程序增添美麗的情調(diào),使您的程序更富魅力、更具專業(yè)。