• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    API實現完美的圖片出現效果

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 9次 | 進入軟件測試論壇討論

    領測軟件測試網 作者:羅玉強

    在用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程序增添美麗的情調,使您的程序更富魅力、更具專業。 

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>