一、 LineDDA函数
1、作用
沿着定义的起始点与结束点组成的直线,重复执行指定的LINEDDAPROC回调函数。
2、声明及参数说明
语法
BOOL LineDDA( _In_ int xStart, _In_ int yStart, _In_ int xEnd,
_In_ int yEnd, _In_ LINEDDAPROC lpProc, _In_opt_ LPARAM data);
参数
xStart[in]
起始点的X轴坐标,单位是像素
yStart[in]
起始点的Y轴坐标,单位是像素
xEnd[in]
结束点的X轴坐标,单位是像素
yEnd[in]
结束点的Y轴坐标,单位是像素
lpProc [in]
用户定义的回调函数,回调函数原型为LINEDDAPROC,详细参考下面的介绍
data [in]
用户定义的数据,作为参数传递给前面的回调函数
返回值
如果执行成功,返回非零值;如果执行失败,返回零。
备注
起始点和结束点之间的线条是使用当前显示分辨率的缺省转换和映射模式来计算的。在线条的每个坐标点(结束点除外)上执行一次回调函数。
使用LineDDA函数,可以绘制一些比较复杂的图形,以及实现动画效果。
二、 LINEDDAPROC回调函数
语法
typedef VOID (CALLBACK* LINEDDAPROC)(int, int, LPARAM);
参数
第一个参数[in]
当前点的X轴坐标,单位是像素
第二个参数[in]
当前点的Y轴坐标,单位是像素
第三个参数[in]
用户定义的数据,也就是上面LineDDA最后一个参数传入的数据
返回值
无返回值。
三、应用实例
1、《深入浅出MFC》中实例
//在窗口WM_PAINT消息响应函数中调用LineDDA
void CMyFrameWnd::OnPaint() //for WM_PAINT
{
CPaintDC dc(this);
CRect rect;
GetClientRect(rect);
dc.SetTextAlign(TA_BOTTOM | TA_CENTER);
::LineDDA(rect.right / 2, 0, rect.right / 2, rect.bottom / 2,
LineDDACallback, (LPARAM)(LPVOID)&dc);
}
VOID CALLBACK CMyFrameWnd::LineDDACallback(int x, int y, LPARAM lParam)
{
CDC* pDC = (CDC*)lParam;
pDC->TextOut(x, y, _T("Hello"));
for (int i = 0; i < 2000000; i++) ;
}
运行结果:
就是Hello字样沿着窗口的中线从上往下移动,直到窗口中间点停止。
解读:
1. LineDDA的最后一个参数,一般传递CDC对象指针;
2. for (int i = 0; i < 2000000; i++) ;
这句话为了延时,利于观察;
3. TextOut函数会在(x, y)处输出一个Hello字样,重复的调用回调函数,为什么没有出现重叠的字样?原因在于,Hello字样输出是以矩形的形式显示的,下一个字样与前一个字样只相差了一个像素的单位,所以下一个字样会覆盖上一个字样,因此最后显示只有一个Hello字样。如果相隔10个像素显示一次,就会出现重叠字样,
VOID CALLBACK CMyFrameWnd::LineDDACallback(int x, int y, LPARAM lParam)
{
CDC* pDC = (CDC*)lParam;
//添加像素判断
if (y % 10 == 0)
pDC->TextOut(x, y, _T("Hello"));
for (int i = 0; i < 2000000; i++) ;
}