使用现有画笔
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);