<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

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

      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卻,再开劥a2塊、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程序增添美麗的情調,使您的程序更富魅力、更具專業。 


      日韩精品一区二区三区高清