
| 出版日期:2000-01-10 总期号:891 本年期号:03 |
|
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 |
|||||||||||||||||