龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VB开发 >

VB中实现图像特技(1)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
在多媒体程序设计中,为了美化显示屏幕,增加画面的动感,常常要用天各种图像显示特技。图像的切换技术能明显美化画面。用VisualBasic编制这类程序时,由于VB自身没有这种切换功能
在多媒体程序设计中,为了美化显示屏幕,增加画面的动感,常常要用天各种图像显示特技。图像的切换技术能明显美化画面。用VisualBasic编制这类程序时,由于VB自身没有这种切换功能,因此需要利用第三方控件或调用WindowsAPI函数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函数):
  PublicConstSRCCOPY=&HCC0020'(DWORD)dest=source
  DeclareFunctionBitBltLib"gdi32"Alias"BitBlt"(ByValhDestDCAsLongByValxAsLongByValyAsLongByValnWidthAsLongByValnHeightAsLongByValhSrcDCAsLongByValxSrcAsLongByValySrcAsLongByValdwRopAsLong)AsLong
  这两句只要从Win32api.txt文件中粘贴即可。
  Form1中的代码:
  在Declare中定义全局变量:
  Constbmpfilemax=5&总共5个bmp文件
  Dimbmpfile(bmpfilemax)AsString&bmp文件的文件名数组
  Dimdrawbmpmode(bmpfilemax)AsInteger&各画显示时的切换方式
  Dimbmpnum,movestep,xmax,ymaxAsInteger
  DimkxyAsSingle&x,y二个方向的比例
  程序运行时先作初始化工作:
  PrivateSubForm-Load()
  bmpnum=0&当前文件号=0,第一个文件
  bmpfile(0)=App.Path ''mp1.bmp''bmpfile(1)=App.Path ''mp2.bmp''
  bmpfile(2)=App.Path ''mp3.bmp''
  bmpfile(3)=App.Path ''mp4.bmp''
  bmpfile(4)=App.Path ''mp5.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&定时器起动
  EndSub
  响应鼠标:
  
  PrivateSubForm-Click()
  End&当有击鼠标动作时程序结束
  EndSub
  
  切换演示工作主要在定时器中完成:
  PrivateSubTimer1-Timer()
  hDestDC=Form1.HDC&目标DC
  hSrcDC=Picture1.hDC&源DC,画是从不可见的Picture1中拷贝到窗体
  drawflag=drawbmpmode(bmpnum)&当前画出现的方式
  SelectCasedrawflag
  Case1&从中间逐步放大
  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)
  Case2&从左到右
  endmax=xmax
  w=movestep*2
  h=Form1.ScaleHeight
  i=BitBlt(hDestDC,0,0,w,h,hSrcDC,X1,Y1,SRCCOPY)
  
  Case3'左右向中间
  endmax=xmax
  w=movestep
  h=Form1.ScaleHeight
  i=BitBlt(hDestDC,0,0,w,h,hSrcDC,0,0,SRCCOPY)&左面部分
  X1=Form1.ScaleWidth-movestep
  50,0)
  Picture1.Cls
  Do
  m=Rnd*Picture1.ScaleWidth
  n=Rnd*Picture1.ScaleHeight-500
  Fori=0ToRnd*800
  Picture1.Line(m,n+2.5*i)-(m+i/2,n+2*i),RGB(180,180,180)
  Picture1.Line(m,n+2.5*i)-(m-i/2,n+2*i),RGB(80,80,80)
  Nexti
  DoEvents
  Loop
  EndSub
  ′结束程序
  PrivateSubCommand3-Click()
  End
  EndSub->

精彩图集

赞助商链接