Windows程序设计--画点和线

点和线是属于绘图的一种,所以它们的函数属于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);

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

你可能感兴趣的:(学习笔记)