china.com
主页
新闻
体育
游戏
文化
教育
健康
财经
科技
旅游
军事
娱乐
商贸
  科技动态 硬件广场 下载基地 网络教室 网络冲浪 科学博览 移动时代 手机上网 桌面壁纸 科技商情  


VB图像特殊技巧

2000-08-14 14:14:23

  为了美化显示屏幕,增加画面的动感,常常要用到各种图像显示特技,图像的切换技术能明显美化画面。用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

  摘自《赛迪网》 旷强/文

404 Not Found

404 Not Found


nginx


科技检索


中华网推荐

  • 1000名医生在线咨询

  • 中国足球队官方网站

  • 鸦片玫瑰(新版)

  • 精选股票天地

  • 闪光的flash教程

  • 中华网汽车世界

  • 为你的爱情出谋划策

  • 网文精选——野百合集

  • 世界文化遗产在中国

  • 历届香港小姐风姿集




  • 网络教室编辑信箱
    版权声明 | 本站检索 | 联系方法 | 刊登广告 | 使用说明 | 关于中华网 | 豁免条款

    版权所有 中华网