Windows程序设计--画点和线

来源:互联网 发布:七日杀不让刷js 编辑:程序博客网 时间:2024/06/04 23:26

点和线是属于绘图的一种,所以它们的函数属于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颜色,如果画的点在剪裁区域外则函数执行失败返回-1COLORREF 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结构);

画点就是那么简单。接下来画线,我们需要一下几个函数。

//画直线

//成功返回非零,失败返回0BOOL 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);

//画折线

//成功返回非零,失败返回0BOOL 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);

基本的画线函数就这些了。会用就行不用深究了。

1 0
原创粉丝点击