LineDDA函数使用

一、 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++) ;
}
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值