专栏导航上一篇第5章[Win32 章节] 绘制直线二回到目录下一篇第5章[Win32 章节] 直线练习程序1本节前言对于本节所讲解的知识有可能你会需要时不时地参考本专栏的其它文章。真的遇到了需要参考之前的文章的知识点请你自行查阅。我呢也会提到一部分的参考课节。但是呢你不应该依赖于我的主动提及。最好呢你自己能够多去了解和查看本专栏目录。学习本节之前需要先学习以下的先修课节。参考课节第5章[Win32 章节] 绘制直线一参考课节第5章[Win32 章节] 绘制直线二本节内容主要来自于对佩措尔德原教材的大段抄录。我们开始。一. 本节内容下面的代码从窗口的左上角开始在客户区中画一个网格线与线之间相距 100 个像素。变量 hwnd 是一个窗口句柄hdc 是一个设备环境句柄x 和 y 都是整数。GetClientRect (hwnd, rect); for (x 0; x rect.right; x 100) { MoveToEx (hdc, x, 0, NULL); LineTo (hdc, x, rect.bottom); } for (y 0; y rect.bottom; y 100) { MoveToEx (hdc, 0, y, NULL); LineTo (hdc, rect.right, y); }看上去使用两个函数来绘制一条直线似乎有些麻烦但是当你想绘制一系列相连接的直线时当前位置会变得非常有用。例如你或许想定义一个含有 5 个点的坐标的数组10 个值它表示一个矩形的轮廓。POINT apt[5] {100, 100, 200, 100, 200, 200, 100, 200, 100, 100};注意最后一个顶点的值与第一个点完全相同。现在只需要使用 MoveToEx 函数将当前位置移到第一个顶点然后对后面的顶点调用 LineTo 函数。MoveToEx (hdc, apt[0].x, apt[0].y, NULL); for (i 1; i 5; i) LineTo (hdc, apt[i].x, apt[i].y);因为 LineTo 会从当前位置但不包括当前位置画到 LineTo 函数中传入的点所以这段代码中没有一个点会被绘制两次。虽然在视频显示器上多次输出不会有问题但是在绘图机或者其他绘制模式下绘制的视觉效果就不太好了我们将在本章后面讨论。注意LineTo 函数在画完线后会将当前位置设置为 LineTo 函数参数中传入的点。如果要将数组的点连接成线调用 Polyline 函数画线会更加容易。下面代码绘制的矩形与上面代码绘制的完全一样。Polyline (hdc, apt, 5);Polyline 的最后一个参数表示点的个数。我们能够通过公式 sizeof(apt)/sizeof(POINT) 来计算这个值。调用 Polyline 函数绘制的矩形与前面使用 MoveToEx 函数和多个 LineTo 函数的效果完全相同。然而Polyline 函数并不使用和改变当前位置。PolylineTo 函数则有点不同它使用当前位置作为起始点画完线后在返回前会将当前位置设置为最后一根线的终点。下面的程序代码绘制的矩形与上面一样。MoveToEx (hdc, apt[0].x, apt[0].y, NULL); PolylineTo (hdc, apt 1, 4);你尽可以使用 Polyline 和 PolylineTo 函数来绘制少量的线条但在需要绘制一个复杂的曲线时它们的价值更能体现出来。可以通过绘制几百条极短的线条来绘制一条复杂的曲线因为如果它们足够短并且足够多那么把它们连接在一起看起来就像一条曲线。比如你想绘制一条正弦波曲线。专栏导航上一篇第5章[Win32 章节] 绘制直线二回到目录下一篇第5章[Win32 章节] 直线练习程序1