利用LineDDA函数做简单动画

原创 2004年08月01日 17:44:00

    如果在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 函数实现,关键就看我们的想象力了。  :D

    这是上面的源程序下载地址:http://csdngoodname008.51.net/LineDDA.zip

 

*-------------------------------------------*

*  转载请通知作者并注明出处,CSDN欢迎您!   *

*  作者:卢培培(goodname008              *

*  邮箱:goodname008@163.com                *

*  专栏:http://blog.csdn.net/goodname008   *

*-------------------------------------------*

利用javascript实现简单动画效果。

利用javascript的setTimeout()函数可以实现简单的动画效果。setTimeout()函数有两个参数,第一个参数是一个字符串,其内容是将要执行的哪个函数的名字;第二个参数是一个数值,它...
  • qq_32600929
  • qq_32600929
  • 2016年11月03日 11:35
  • 1300

《MFC游戏开发》笔记五 定时器和简单动画

本系列文章由七十一雾央编写,转载请注明出处。 http://blog.csdn.net/u011371356/article/details/9313239 作者:七十一雾央 新浪微博:http:...
  • u011371356
  • u011371356
  • 2013年07月15日 15:10
  • 13022

利用canvas的rotate创建一个简易的风车动画

刚接触canvas的rotate属性,突发奇想能不能用它做个风车转动的效果,可是它旋转时却不是按照固定点旋转的,后来查阅了网上资料,网上说rotate旋转的不是图形,而是画布,于是我就想到将要旋转图形...
  • haibeimingsi
  • haibeimingsi
  • 2015年08月28日 15:23
  • 1411

java 怎样做出完美动画,(包括透明效果)

有一张 gif  我处理了一下,拿到 java 上,直接 g.draw 是这个效果:   这已经是处理的极限,因为这张图做出来是为白底背景而作,而我的背景是黑底。 但,最终我做出来是这个效果...
  • cnmm22
  • cnmm22
  • 2015年04月03日 14:01
  • 3126

JS封装缓动动画函数

/* * 缓动动画函数 * 原理:盒子原本的样式值 + "步长"(不断变化的值);达到目标值后停止缓动。 * obj:指定的节点对象 * attr_json:样式属性和值的集合(json对象格式,如{...
  • qq_18972075
  • qq_18972075
  • 2015年11月24日 20:50
  • 2113

3DMax人物动画制作

3DMax中对于人物动画制作方法有很多,此篇博客将介绍一种对于简单人物动画的制作方法。首先理解3DMax中形成动画的原理。3DMax中的动画是一系列静态图像以足够快的帧速播放,使得肉眼看上去他们是连续...
  • feilong_csdn
  • feilong_csdn
  • 2015年10月09日 23:18
  • 1517

利用css3属性:transition-duration来做简单的动画

transition-duration是属于css3的属性,用来指定对象过渡的持续时间。 为了兼容不同的浏览器,需要加上相应的前缀,有以下几种写法,我们设定持续时间为3秒: selector{...
  • hutaoer06051
  • hutaoer06051
  • 2013年01月08日 19:06
  • 1545

关于VC中LineDDA函数的调用

在项目里碰到这个函数,不知道怎么使用,记录在这里。该函数的原型如下: BOOL LineDDA(int nXStart, int nYStart, int nXEnd, int nYEnd, LINE...
  • caimouse
  • caimouse
  • 2017年08月02日 10:10
  • 434

Delphi 常用API 函数(好多都没见过)

AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeIconicWindows 排列一个父窗...
  • xtfnpgy
  • xtfnpgy
  • 2016年10月31日 19:53
  • 373

MATLAB中进行动画制作心得体会及例程

在MATLAB中进行动画制作    之前应该是说是因为上最优化理论的时候,老师叫我们制作一个动画,用来比较最优降线和和其他曲线下落时间。自己也是第一次用MATLAB来制作动画,首先自己先去网上下载程...
  • u014077947
  • u014077947
  • 2016年11月09日 22:34
  • 4574
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用LineDDA函数做简单动画
举报原因:
原因补充:

(最多只允许输入30个字)