VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB中实现图像特技
发表评论(0)作者:, 平台:, 阅读:10304, 日期:2000-03-29
在多媒体程序设计中,为了美化显示屏幕,增加画面的动感,常常要用天各种图像显示特技。图像的切换技术能明显美化画面。用Visual Basic编制这类程序时,由于VB自身没有这种切换功能,因此需要利用第三方控件或调用W indowsAPI函数BitBlt来实现这种功能。本文介绍用BitBlt函数实现画面的各种切换方法,供大家参考。

假设有5个图像文件(Picture1-Picture5),我们的目标是让这5幅画自动地循环显示,每幅画以某种切换方式出现,当有击鼠标动作时退出程序。

1 创建项目文件:

运行VB,建立一个新工程文件Project1,加入一个新的Form名称为Form1,和一个模块文件Modull,在Form1中加入一个图画框Picture1和一个定时器Timer1。

设置各控件的属性如下:

Form1:AutoRedraw:True

ScaleMode:3

Picture1:AutoRedraw:True

ScaleMode:3

Visible:False

2 代码编写

Modull.bas中的内容(声明BitBlt函数):

Public Const SRCCOPY=&HCC0020’(DWORD)dest=source

Declare Function BitBlt Lib "gdi32"Alias "BitBlt"(By Val 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

这两句只要从Win32api.txt文件中粘贴即可。

Form1中的代码:

在Declare中定义全局变量:

Const bmpfilemax=5&总共5个bmp文件

Dim bmpfile(bmpfilemax)As String&bmp 文件的文件名数组

Dim drawbmpmode(bmpfilemax) As Integer&各画显示时的切换方式

Dim bmpnum,movestep,xmax,ymax As Integer

Dim kxy As Single &x,y二个方向的比例

程序运行时先作初始化工作:

Private Sub Form-Load ()

bmpnum=0 &当前文件号=0,第一个文件

bmpfile(0)=App.Path+''\bmp1.bmp'' bmpfile(1)=App.Path+''\bmp2.bmp''

bmpfile(2)=App.Path+''\bmp3.bmp''

bmpfile(3)=App.Path+''\bmp4.bmp''

bmpfile(4)=App.Path+''\bmp5.bmp''

drawbmpmode(0)=1

drawbmpmode(1)=5

drawbmpmode(2)=3

drawbmpmode(3)=4

drawbmpmode(4)=2

movestep=0 &步进参数

xmax=Form.ScaleWidth/2

ymax=Form.ScaleHeight/2

kxy =ymax/xmax

Picture1.Picture=LoadPicture(bmpfile(bmpnum))

Timer1.Interval=30 &定时器起动

End Sub

响应鼠标:


Private Sub Form-Click ()

End &当有击鼠标动作时程序结束

End Sub


切换演示工作主要在定时器中完成:

Private Sub Timer1-Timer ()

hDestDC=Form1.HDC&目标DC

hSrcDC=Picture1.hDC&源DC,画是从不可见的Picture1中拷贝到窗体

drawflag =drawbmpmode(bmpnum)&当前画出现的方式

Select Case drawflag

Case 1 &从中间逐步放大

endmax=xmax&用于结束判断

X1=xmax-movestep

w=movestep*2

Y1=Cint(ymax-movestep*kxy)

h=Cint(2*movestep*kxy)

i=BitBlt(hDestDC,X1,Y1,w,h,hSrcDC,X1,Y1,SRCCOPY)

Case 2 &从左到右

endmax=xmax

w=movestep*2

h=Form1.ScaleHeight

i=BitBlt(hDestDC,0,0,w,h,hSrcDC,X1,Y1,SRCCOPY)


Case 3 '左右向中间

endmax=xmax

w=movestep

h=Form1.ScaleHeight

i=BitBlt(hDestDC,0,0,w,h,hSrcDC,0,0,SRCCOPY) &左面部分

X1= Form1.ScaleWidth-movestep

i=BitBlt(hDestDC,X1,0,w,h,hSrcDC,X1,0,SRCCOPY) &左面部分

Case 4 '栅条状

endmax=CInt(2*xmax/10) &共分阶10条

tempi=CInt(2*xmax/10)

w=movestep

h=Form1.ScaleHeight

For ij=0 To 9

i=BitBlt(hDestDC,tempi*ij,0,w,h,hSrcDC,tempi*ij,0,SRCCOPY)

Next ij

Case 5 '棱形状

endmax=CInt(2*xmax/10)

tempi=CInt(2*xmax/10)

w=movestep

For ih=0 To w-1

For ik=0 To 9

For ij=0 To 9

l=tempi*ik+tempi/2

t=tempi*ij+tempi/2

i=BitBlt(hDestDC,1-(w-ih),t-ih,(w-ih)*2,1,hSrcDC,1-(w-ih), t-ih, SRCCOPY)

i=BitBlt(hDestDC,1-(w-ih),t+ih,(w-ih)*2,1,hSrcDC,1-(w-ih), t+ih, SRCCOPY)

Next ij

Next ik

Next ih

End Select


Form1.Refresh


movestep=movestep+2 &步进增加

If movestep>endmax Then&若步进够大,画面都已显示,本张画结束切换

bmpnum=bmpnum+1 &进到下一张画

If bmpnum>=bmpfilemax Then&若5张画已显示完则再从第一张开始

bmpnum=0

End If

movestep=0

Picture1.Picture=LoadPicture(bmpfile(bmpnum))

End If

End Sub