GDI 画笔(9)

使用现有画笔

Windows 提供三种备用画笔(Stock Pen):BLACK_PEN(黑色画笔)、WHITE_PEN(白色画笔)、NULL_PEN(不绘制任何图形的画笔)。

调用 GetStockObject 函数可以获取备用画笔的句柄(HPEN),调用 SelectObject 函数可以将指定的画笔选入设备环境,并返回之前选入设备环境的画笔句柄:

// 定义画笔句柄
HPEN hPen, hPrevPen;

// 获取备用画笔的句柄
hPen = GetStockObject(WHITE_PEN);

// 将画笔选入设备环境,函数返回之前选入设备环境的画笔的句柄
hPrevPen = SelectObject(hdc, hPen);

GDI 对象使用规则

  • 最终应当删除所有由用户创建的 GDI 对象
  • 当 GDI 对象被选入一个有效的设备环境时,不可删除它
  • 不可删除备用对象(Stock Object)

创建画笔

调用 CreatePen 函数可以创建一个画笔,画笔句柄将作为返回值返回:

HPEN CreatePen(
    int fnPenStyle,    // 画笔样式(决定绘制的是实线、虚线或点线)
    int nWidth,        // 画笔宽度(为 0 时,将设为 1 个像素。虚线或点线只能为 1 个像素,否则将被设为实线)
    COLORREF crColor   // 画笔颜色(COLORREF 值,可以通过 RGB 宏指定)
);

调用 CreatePenIndirect 函数可以根据 LOGPEN(逻辑画笔)结构来建立一个画笔,画笔句柄将作为返回值返回:

LOGPEN 结构:

typedef struct tagLOGPEN { 
    UINT     lopnStyle; // 画笔样式
    POINT    lopnWidth; // 画笔宽度(Windows 仅使用 x 字段)
    COLORREF lopnColor; // 画笔颜色
} LOGPEN, *PLOGPEN;

CreatePenIndirect 函数:

HPEN CreatePenIndirect(
  CONST LOGPEN *lplgpn   // LOGPEN 结构的地址
);

选择画笔

调用 SelectObject 函数,可以将刚刚创建的画笔选入设备环境,并返回之前选入设备环境的画笔句柄:

HGDIOBJ SelectObject(
    HDC hdc,          // 设备环境句柄
    HGDIOBJ hgdiobj   // GDI 对象句柄(这里指画笔句柄)
);

删除画笔

调用 DeleteObject 函数,可以将使用完的画笔删除:

BOOL DeleteObject(
  HGDIOBJ hObject   // GDI 对象句柄(这里指画笔句柄)
);

注:不要删除已被选入设备环境的当前画笔

获取创建的画笔

调用 GetObject 函数可以从指定画笔句柄中,得到关于此画笔的 LOGPEN 结构的各个字段的值:

GetObject(hPen, sizeof(LOGPEN), (LPVOID)&logpen);

调用 GetCurrentObject 函数可以获取当前被选入设备环境的画笔句柄:

hPen = GetCurentObject(hdc, OBJ_PEN);

猜你喜欢

转载自www.cnblogs.com/yenyuloong/p/9122372.html