直与复营销策划机构:关于VC中LineDDA函数的调用问题

来源:百度文库 编辑:中科新闻网 时间:2024/04/29 01:20:14
下面是LineDDA函数的一个例子
void CMyView::OnPaint()

{

CPaintDC dc(this);

CRect rect;

GetClientRect(rect);

dc.SetTextAlign(TA_BOTTOM | TA_CENTER);

::LineDDA(rect.right/2, 0, rect.right/2, rect.bottom/2,

(LINEDDAPROC) LineDDACallback, (LPARAM) (LPVOID) &dc);

}

//--------------------------------------------------------------------

VOID CALLBACK CMyView::LineDDACallback(int x, int y, LPARAM lpdc)

{

static char szText[] = "Hello, MFC";

((CDC*)lpdc)->TextOut(x, y, szText, sizeof(szText)-1);

for(int i=1; i<50000; i++);

}
我的问题是:LineDDA调用回调函数显示字符串的时候,为什么字符串不是重叠显示而是动画显示,在前一个像素点显示的字符串怎么会被擦除而直接显示了下一个像素点的字符串?而且我把LineDDA函数放在OnDraw函数中,为什么最后没有显示字符串出来?难道LineDDA函数一定要放在OnPaint函数中吗?
晕,大侠,你就帮帮偶吧,偶现在还是菜鸟,所以提的问题应该不会浪费很多脑细胞的。不要嫌分少啦,偶已经尽最大努力啦!

如果在VC中实现比较简单的动画效果,也许很多人会选用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)