点和线是属于绘图的一种,所以它们的函数属于GDI函数,那么就先需要了解一下GDI函数。
GDI函数的主要分类:
1.取得或释放设备内容的函数
比如:
BeginPaint和EndPaint函数
GetDC和RealseDC函数等等
2.取得有关设备内容信息的函数
比如:
GetTextMetrics获取字体的信息
3.绘图函数
比如:
LineTo 画直线
Polyline和PolylineTo 画一系列相连的直线
PolyPolyline 画多组相连的线。
Arc 画椭圆线。
PolyBezier和PolyBezierTo 画贝塞尔曲线
4.设定和取得设备内容参数的函数
比如:
设置背景模式SetBkMode
设置绘图模式SetROP2
设置映射模式SetMapMode
设置字体颜色SetTextColor
对应的也有获取……
5.使用GDI对象的函数
比如:
画刷对象HBRUSH hBrush;
画笔对象HPEN hPen;等等
GDI函数几乎都要使用到HDC hDc;设备环境句柄。
现在画点,我们需要以下几个函数:
//该函数将指定坐标处的像素设为指定的颜色。
//成功返回那个逻辑点的RGB颜色,如果画的点在剪裁区域外则函数执行失败返回-1
COLORREF SetPixel(
HDC hdc, // 设备环境句柄
int X, // 逻辑点x
int Y, // 逻辑点y
COLORREF crColor // 设置该点的颜色
);
//画一个点//通常很难看出来
SetPixel(hdc, 100, 100, RGB(0, 255, 0));
//用点画线
//在WM_PAINT消息中画,如果你在WM_CREATE消息中画,那么将会不停的弹出失败。
//因为WM_CREATE消息中只是初始化窗口,此时窗口还没有被WM_PAINT所以函数会执行失败
for (int i = 100;i < 500;i++)
{
if (-1 == SetPixel(hdc, i, i, RGB(0, 255, 0)))
{
MessageBox(nullptr, L"函数执行失败", L"", MB_OK);
}
}
//GetPixel函数传回指定坐标处的图素颜色
//如果xy坐标不在剪裁区域内则函数执行失败返回CLR_INVALID ,成功返回RGB颜色
COLORREF GetPixel(
HDC hdc, // 设备环境句柄
int nXPos, // 逻辑点x
int nYPos // 逻辑点y
);
比如:
if (CLR_INVALID == GetPixel(hdc,-1,-1))
{
MessageBox(nullptr, L"函数执行失败", L"", MB_OK);
}
//获取当前位置的函数
BOOL GetCurrentPositionEx(
HDC hdc, // 设备环境句柄
LPPOINT lpPoint // 获取当前位置并存入POINT结构
);
画点就是那么简单。接下来画线,我们需要一下几个函数。
//画直线
//成功返回非零,失败返回0
BOOL LineTo(
HDC hdc, // 设备环境句柄
int nXEnd, // 结束点x
int nYEnd // 结束点y
);
//这个函数是有终点坐标,所以理所当然的要给它个起点坐标
//把绘图位置移动到某个点
BOOL MoveToEx(
HDC hdc, // 设备环境句柄
int X, // 起点x
int Y, // 起点y
LPPOINT lpPoint // 旧的位置(可以获取)
);
//起点为(0,0),终点为(100,100)的直线
MoveToEx(hdc, 0, 0, nullptr);
LineTo(hdc, 100, 100);
//画折线
//成功返回非零,失败返回0
BOOL Polyline(
HDC hdc, // 设备环境句柄
CONST POINT *lppt, // 存放点的数组
int cPoints // 有多少个点
);
//一般要定义一个点的数组
POINT pt[3]={0};
[其它代码]
//然后设置每个点的值
pt[0].x = 10;
pt[0].y = 10;
pt[1].x = 200;
pt[1].x = 100;
pt[2].x = 300;
pt[2].y = 150;
//把每个点连接起来
Polyline(hdc, pt, 3);
//和PolyLine不同,PolyLineTo使用目前位置作为开始点,并将目前位置设定为最后
//一根线的终点,根据apt的点依次画直线。设置目前位置可调用
MoveToEx函数.
BOOL PolylineTo(
HDC hdc, // 设备环境句柄
CONST POINT *lppt, // 存放点的数组
DWORD cCount // 有多少个点
);
如果不调用MoveToEx函数设置当前位置,则默认从(0,0)点开始画
//如果要连接起点则一共有4组坐标,如果不连就三组
MoveToEx(hdc, 200, 0, nullptr);
PolylineTo(hdc, pt, 4);
//PolylineTo(hdc, pt, 3);
//用当前选定画笔描绘两个或多个多边形
BOOL PolyPolyline(
HDC hdc, // 设备环境句柄
CONST POINT *lppt, // 存放坐标的数组
CONST DWORD *lpdwPolyPoints, // 每一组折线有多少个坐标
DWORD cCount // 有多少组折线
);
比如:
POINT pt[6]={0};
DWORD lpdwPolyPoints[2]={0};
//第一组坐标组成一条折线
pt[0].x = 100;
pt[0].y = 50;
pt[1].x = 200;
pt[1].y= 100;
//第二组坐标组成一条折线
pt[2].x = 300;
pt[2].y = 50;
pt[3].x = 200;
pt[3].y = 80;
pt[4].x = 400;
pt[4].y = 100;
pt[5].x = 300;
pt[5].y = 150;
//第一组坐标有2个坐标点
lpdwPolyPoints[0] = 2;
//第二组坐标有4个坐标点
lpdwPolyPoints[1] = 4;
PolyPolyline(hdc, pt, lpdwPolyPoints,2);
//画椭圆弧线
BOOL Arc(
HDC hdc, // 设备环境句柄
int nLeftRect, // 矩形的左上角坐标x
int nTopRect, // 矩形的左上角坐标y
int nRightRect, // 矩形的右下角坐标x
int nBottomRect, // 矩形的右下角坐标y
int nXStartArc, // 弧的起点x
int nYStartArc, // 弧的起点y
int nXEndArc, // 弧的终点x
int nYEndArc // 弧的终点y
);
很简单的一个函数,按着填就行了。
//画贝赛尔样条曲线
BOOL PolyBezier(
HDC hdc, // 设备环境句柄
CONST POINT* lppt, // 包括了样条端点和控制点的坐标
DWORD cPoints // 数组中的点的个数
);
CONST POINT* lppt:其顺序是起点的坐标、起点的控制点的坐标、终点的控制点的坐标和终点的坐标
pt[0].x = 100;
pt[0].y = 100;//起点坐标
pt[1].x = 200;
pt[1].y = 100;//起点的控制点的坐标
pt[2].x = 300;
pt[2].y = 300;//终点的控制点的坐标
pt[3].x = 200;
pt[3].y = 400;//终点的坐标
PolyBezier(hdc, pt, 4);
基本的画线函数就这些了。会用就行不用深究了。