六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

API完成圓滿的圖片出現效果

[摘要]作者:羅玉強 在用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程序增添美麗的情調,使您的程序更富魅力、更具專業。 


主站蜘蛛池模板: 香蕉视频一区 | 天天躁日日躁成人字幕aⅴ 天天躁日日躁 疯人影院 | 中文字幕欧美在线 | 一级毛片黄片 | 天天影视综合色区 | 亚洲日韩中文字幕在线播放 | 亚洲成人欧美 | 欧美一级免费片 | 亚洲精品在线免费 | 亚洲国产精品久久久天堂麻豆 | 日日摸夜夜摸狠狠摸日日碰夜夜做 | 香蕉国产成版人视频在线观看 | 亚洲国产天堂久久综合图区 | 日本特黄特色aaa大片免费欧 | 欧美特黄一级视频 | 伊人久久中文字幕久久cm | 午夜三级国产精品理论三级 | 综合网色| 亚洲欧美韩日 | 日本大片在线免费观看 | 日韩精品免费一线在线观看 | 午夜影院在线观看视频 | 色香蕉视频 | 日日夜干 | 日本不卡免费新一区二区三区 | 日本三级香港三级三级人!妇久 | 有码日韩 | 亚洲全网成人资源在线观看 | 日韩欧美片 | 亚洲成人高清在线 | 日本96在线精品视频免费观看 | 日本免费在线视频 | 三级自拍| 日韩黄色免费观看 | 亚洲一区二区福利视频 | 午夜三级成人三级 | 午夜视频播放 | 中文字幕在线精品视频入口一区 | 日韩精品久久久毛片一区二区 | 伊人看片| 亚洲福利秒拍一区二区 |