ccidnet????

出版日期:2000-01-10 总期号:891 本年期号:03

本期导读
要闻综合
电脑工作室
市场
硬件
软件
infotimes
vb图像特殊技巧

旷强

  为了美化显示屏幕,增加画面的动感,常常要用到各种图像显示特技,图像的切换技术能明显美化画面。用vb编制这类程序时,由于vb自身没有这种切换功能,因此需要控件的参与或调用api函数bitblt来实现这种功能。这里向你展示用bitblt函数实现画面的各种足以令人兴奋的效果。

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

  创建项目文件

  建立一个新工程文件project1,加入一个新的form名称为form1;添加一个模块文件modull;在form1中加入一个图画框picture1和一个定时器timer1。

  设置属性如下:

  form1:autoredraw:true

  scalemode:3

  picture1:autoredraw:true

  scalemode:3

  visible:false

  编写代码

   声明bitblt函数——modull.bas中的内容:

  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文件中粘贴即可(使用api查看器)。

  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

  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)

   tempi=cint(2*xmax/10)

   w=movestep

   h=form1.scaleheight

   for s=0 to 9

  i=bitblt(hdestdc,tempi*s,0,w,h,hsrcdc,tempi*s,0,srccopy)

   next s

   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

   bmpnum=0

   end if

   movestep=0

   picture1.picture=loadpicture(bmpfile(bmpnum))

   end if end sub