admin 管理员组

文章数量: 887006

windows编程之GDI绘图

文章目录

    • @[toc]
  • windows编程之GDI绘图--点线绘制
    • 点绘制
      • SetPixel
      • SetPixelV
      • GetPixel
    • 直线绘制
      • MoveToEx
      • LineTo
    • 折线绘制
      • Polyline
      • PolylineTo
      • PolyPolyline
      • PolyBezier

windows编程之GDI绘图–点线绘制


点绘制

  • SetPixel (绘制一个像素点为指定颜色)
  • GetPixel (获得一个像素点的颜色)
  • SetPixelV (比 SetPixel 快)

SetPixel

  • API 函数原型:

    COLORREF SetPixel(_In_  HDC hdc,_In_  int x,_In_  int y,_In_  COLORREF crColor
    );
    

    注释:In 说明该参数是输入的,opt 说明该参数是可选参数。

参数解析:

参数含义
hdc设备环境句柄
x指定要设置的像素点的 X 轴坐标,按逻辑单位表示坐标
y指定要设置的像素点的 Y 轴坐标,按逻辑单位表示坐标
crColor【1】指定该像素点的颜色 【2】使用 RGB 宏创建 COLORREF 的颜色值

注释:COLORREF 颜色被定义为 DWORD 类型(4 个字节),用于表示 RGB 颜色。

返回值:

  1. 如果函数调用成功,那么返回值就是函数设置像素的 RGB 颜色值(这个值可能与 crColor 指定的颜色有所不同,之所以有时发生这种情况是因为没有找到对指定颜色进行真正匹配造成的);

  2. 如果函数调用失败,那么返回值是 -1。

可以是以下值

返回值含义
ERROR_INVALID_PARAMETER一个或者多个参数不正确

备注:

  1. 如果像素点坐标位于当前剪裁区之外,那么该函数执行失败。

  2. 不是所有设备都支持 SetPixel 函数。有关详情,请参考 GetDeviceCaps。


SetPixelV

参数与SetPixel是一样的

SetPixelV 函数比 SetPixel 函数快,因为 SetPixelV 不需要返回实际绘制的像素值(返回布尔类型)。

返回值:

  1. 如果函数调用成功,返回值为非 0;

  2. 如果函数调用失败,返回值为 0。


GetPixel

  • API 函数原型:

    COLORREF GetPixel(_In_  HDC hdc,_In_  int nXPos,_In_  int nYPos
    );
    

    注释:In 说明该参数是输入的,opt 说明该参数是可选参数。

参数解析:

参数含义
hdc设备环境句柄
nXPos指定要获取的像素点的 X 轴坐标,按逻辑单位表示坐标
nYPos指定要获取的像素点的 Y 轴坐标,按逻辑单位表示坐标

返回值:

  1. 返回值是 COLORREF 值,指定像素的 RGB(可以通过 GetRValue、GetGValue 和 GetBValue 宏分别获得红、绿、蓝分别的色值);

  2. 如果指定的像素点在当前剪裁区之外;那么返回值是 CLR_INVALID

备注:

  1. 如果像素点坐标位于当前剪裁区之外,那么该函数执行失败。

  2. 不是所有设备都支持 GetPixel 函数。有关详情,请参考 GetDeviceCaps。

  3. 位图必须选入设备环境中,否则也会返回 CLR_INVALID

  4. 返回值CLR_INVALID (0xFFFFFFFF在 Wingdi.h) 中定义


直线绘制

  • MoveToEx (指定直线的起点)

  • LinetTo (指定直线的终点)


MoveToEx

MoveToEx 函数将当前绘图位置移动到某个具体的点,同时也可获得之前位置的坐标。

  • API 函数原型:
BOOL MoveToEx(_In_   HDC hdc,_In_   int X,_In_   int Y,_Out_  LPPOINT lpPoint
);

参数解析:

参数含义
hdc指定设备环境句柄
X指定新位置的 X 轴坐标,按逻辑单位表示坐标
Y指定新位置的 Y 轴坐标,按逻辑单位表示坐标
lpPoint1. 一个 POINT 结构的指针,用于获得之前位置的坐标 2. 如果这个值是 NULL,则不会获得之前位置的坐标

返回值:

  1. 如果函数调用成功,返回值是非 0;

  2. 如果函数调用失败,返回值是 0。

备注:

  1. MoveExTo 函数将影响所有的绘图函数。

  2. 在默认的设备环境中,点 (0, 0) 为最初设定的当前位置。


LineTo

LineTo 函数使用当前画笔绘制一条线,线段从当前位置连到一个指定的点 (x, y)。

当这个函数调用完毕后,当前位置变成 (x, y)。

  • API 函数原型:
BOOL LineTo(_In_  HDC hdc,_In_  int nXEnd,_In_  int nYEnd
);

注释:In 说明该参数是输入的,opt 说明该参数是可选参数。

参数解析:

参数含义
hdc指定设备环境句柄
nXEnd【1】线段终点X坐标位置,采用逻辑坐标表示。 【2】这个点不会实际画出来,因为它不属于线段的一部份
nYEnd【1】线段终点Y坐标位置,采用逻辑坐标表示。【2】这个点不会实际画出来,因为它不属于线段的一部份

返回值:

  1. 如果函数调用成功,返回值是非 0;

  2. 如果函数调用失败,返回值是 0。


折线绘制

  • Polyline
  • PolylineTo
  • PolyPolyline
  • PolyBezier (贝塞尔曲线)

Polyline

Polyline 函数将指定数组的连接点绘制成一系列线段(折线)。

  • API 函数原型:

    BOOL Polyline(_In_  HDC hdc,_In_  const POINT *lppt,_In_  int cPoints
    );
    

    注释:In 说明该参数是输入的。

参数解析:

参数含义
hdc指定设备环境句柄
lppt一个指向 POINT 结构 的数组的指针(折线的顶点)
cPoints【1】lppt 参数指向的数组中顶点POINT 结构 的个数 【2】该值必须大于或等于 2

返回值:

  1. 如果函数调用成功,返回值是非 0;

  2. 如果函数调用失败,返回值是 0。

备注:

  1. 该折线是使用当前画笔,通过将指定数组中的顶点依次连接绘制出来的。

  2. 不像 LineToPolylineTo 函数,Polyline 函数既不会用到当前位置,也不会去修改它。


PolylineTo

PolylineTo 函数将指定数组的连接点绘制成一系列线段(折线)。

  • API 函数原型:

    BOOL PolylineTo(_In_  HDC hdc,_In_  const POINT *lppt,_In_  DWORD cCount
    );

参数解析:

参数含义
hdc指定设备环境句柄
lppt一个指向 POINT 结构 的数组的指针(折线的顶点)
cCount【1】 lppt 参数指向的数组中顶点 POINT 结构 的个数 【2】该值必须大于或等于 2

返回值:

  1. 如果函数调用成功,返回值是非 0;

  2. 如果函数调用失败,返回值是 0。

备注:

  1. 不像 Polyline 函数,PolylineTo 函数会使用并修改当前位置。

  2. 绘画时,会使用使用当前画笔,先从当前位置画一条线连接到 lppt 指定的第一个顶点的位置,然后画到下一个顶点,以此类推。

  3. 绘画完成之后,会将当前位置移动到最后一个顶点的位置。

  4. 如果该函数绘制了一个封闭的图形,那么该图形不会被填充。


PolyPolyline

PolyPolyline 函数用于同时绘制多条折线。

  • API 函数原型:

    BOOL PolyPolyline(_In_  HDC hdc,_In_  const POINT *lppt,_In_  const DWORD *lpdwPolyPoints,_In_  DWORD cCount
    );
    

参数解析:

参数含义
hdc指定设备环境句柄
lppt一个指向 POINT 结构的数组的指针(一系列折线上的顶点)
lpdwPolyPoints一个指向数组的指针,数组中每个元素用于指定 lppt 参数中相应折线的顶点的数量
cCountlpdwPolyPoints 参数指向的数组的元素数量(折线的数量)

返回值:

  1. 如果函数调用成功,返回值是非 0;

  2. 如果函数调用失败,返回值是 0。

备注:

  1. 该函数绘制的一系类折线都是使用当前画笔完成。

  2. 该函数绘制的图形并没有填充。

  3. 该函数既不会用到当前位置,也不会去修改它。


PolyBezier

PolyBezier 函数用于绘制一个或多个贝塞尔曲线。

贝赛尔曲线是一种非常优美的曲线,一条贝赛尔样条由4个定义点定义:两个端点和两个控制点。

  • API 函数原型:
BOOL PolyBezier(_In_  HDC hdc,_In_  const POINT *lppt,_In_  DWORD cPoints
);

参数解析:

参数含义
hdc指定设备环境句柄
lppt1. 一个指向 POINT 结构的数组的指针,该数组包含端点和控制点的坐标 2. 顺序是起点、第一控制点、第二控制点和终点
cPoints指明 lppt 指向的数组中点的个数

返回值:

  1. 如果函数调用成功,返回值是非 0;

  2. 如果函数调用失败,返回值是 0。

备注:

  1. PolyBezier 函数通过使用由 lppt 参数指定的端点和控制点绘制一条或多条三次贝塞尔曲线。

  2. 第一条贝塞尔曲线的四个点依次是:起点、第一控制点、第二控制点和终点;随后的每一条贝塞尔曲线则只需给出三个点,因为前一条贝塞尔曲线的终点会被当作后一条贝塞尔曲线的起点,以此类推。

  3. 绘制一系列相连的贝塞尔曲线时,仅当第一条贝塞尔曲线的第二个控点、第一条贝塞尔曲线的终点(也就是第二条贝塞尔曲线的起点)与第二条贝塞尔曲线的第一个控点是线性关系时(即三点共线时),曲线在连接点处才是平滑的。


enjoy it ~

本文标签: windows编程之GDI绘图