• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

VB中利用LineDDA函数做简单动画

发布: 2007-5-26 13:55 | 作者: 佚名 | 来源: 互连网 | 查看: 57次 | 进入软件测试论坛讨论

领测软件测试网
  如果在VB中实现比较简单的动画效果,也许很多人会选用Timer控件,其实API函数中有一个LineDDA,用这个函数实现简单的动画效果还是比较不错的。因为是API函数,所以很一般化,因此很多语言都可以用它来实现简单的动画。
  
  该函数的原型如下:
  BOOL LineDDA(int nXStart, int nYStart, int nXEnd, int nYEnd, LINEDDAPROC lpLineFunc, LPARAM lpData);
  
  参数说明如下:
  
  nXStart:起点的X值
  
  nYStart:起点的Y值
  
  nXEnd:终点的X值
  
  nYEnd:终点的Y值
  
  lpLineFunc:回调函数的地址
  
  lpData:用户自定义参数(这个参数会传给回调函数)
  
  这个函数和动画其实没什么关系,它的功能就是计算出连接两点的线段上的每一个屏幕像素的坐标,这两个点的坐标已经在函数的前四个参数中给出。每计算出一个坐标,该函数就会调用第五个参数所指的回调函数,我们可以在回调函数中完成一些简单的操作,以实现动画效果。
  
  回调函数的原型是: VOID CALLBACK LineDDAProc(int X, int Y, LPARAM lpData);
  
  前两个参数是点的坐标,第三个参数就是由LineDDA传过来的自定义参数,是由我们自己指定的,传什么都行。 :)
  
  LineDDA 函数在VB中的声明是:
  Public Declare Function LineDDA Lib "gdi32.dll" (ByVal n1 As Long, ByVal n2 As Long, ByVal n3 As Long, ByVal n4 As Long, ByVal lpLineDDAProc As Long, ByVal lParam As Long) As Long
  
  其回调用函数原型为:
  
  Public Sub LineDDAProc(ByVal X As Long, ByVal Y As Long, ByVal lpData As Long)
  
  在VB中,回调函数必须放在标准模块中,传递函数地址时使用AddressOf运算符,后面接函数名。
  
  VB源程序如下:
  窗体模块:
  Option Explicit
  
  Private Sub Command1_Click()
  
    ' 循环调用 LineDDA 函数, 在其指定的回调中实现简单动画
  
    Dim i As Long
  
    Dim point(9) As POINTAPI
  
    For i = 0 To UBound(point) - 1
  
      point(i + 1).X = point(i).X + 50
  
      If point(i).Y = 0 Then point(i + 1).Y = 50 Else point(i + 1).Y = 0
  
      LineDDA point(i).X, point(i).Y, point(i + 1).X, point(i + 1).Y, AddressOf LineDDAProc, Me.hdc
  
    Next i
  
  End Sub
  
  标准模块:
  Option Explicit
  
  ' API 函数声明
  
  Public Declare Function LineDDA Lib "gdi32.dll" (ByVal n1 As Long, ByVal n2 As Long, ByVal n3 As Long, ByVal n4 As Long, ByVal lpLineDDAProc As Long, ByVal lParam As Long) As Long
  
  Public Declare Function DrawText Lib "user32.dll" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
  
  Public Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
  
  ' API 类型声明
  
  Public Type RECT
  
    Left As Long
  
    Top As Long
  
    Right As Long
  
    Bottom As Long
  
  End Type
  
  Public Type POINTAPI
  
    X As Long
  
    Y As Long
  
  End Type
  
  ' API 常量声明
  
  Private Const DT_CENTER = &H1
  
  Private Const DT_VCENTER = &H4
  
  ' LineDDA 函数的回调函数
  
  ' 参数: X, Y 为点坐标, lpData 为自定义参数
  
  Public Sub LineDDAProc(ByVal X As Long, ByVal Y As Long, ByVal lpData As Long)
  
    Dim rct As RECT
  
    If X Mod 10 = 0 Then
  
      rct.Left = X
  
      rct.Right = rct.Left + 18
  
      rct.Top = Y
  
      rct.Bottom = rct.Top + 18
  
      DrawText lpData, "LPP", -1, rct, DT_CENTER Or DT_VCENTER
  
      Sleep (100)
  
      DoEvents
  
    End If
  
  End Sub
  
  上面的程序实现的效果是在窗体上按照一条反折线动态显示一些文字,在窗体中添加一个CommandButton,复制上面的代码即可。其实,在著名的PGP加密软件中,当密码输入错误时,窗口会很调皮的抖动一下,这个效果完全可以用 LineDDA 函数实现,关键就看我们的想象力了。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网