正如前文所述,DC 相当黑板, 黑板有了没笔也画不了图, 现在我们就来看看画笔(GDI 图形对象之一).
GDI 绘图对象包括: 画笔,画刷,位图,调色板,区域, 每一个绘图对象都有着自身特点和功能,今天请的画笔又有什么功能呢? 画笔主要用于绘制直线和曲线,还有着:大小, 颜
色, 线条类型等属性;
一、创建画笔
GDI提供了三种方法:
1. HPEN CreatePen(int fnPenStyle, nWidth, COLORREF crColor)
fnPenStyle - 线条的风格: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL, PS_INSIDEFRAME
nWidth - 线条宽: 为0是表示单个象素宽,当设定一定宽时线条风格会自动以PS_SOLID风格显示
crColor - 线条颜色
2. HPEN CreatePenIndirect(const LOGPEN* logPen)
typedef struct tagLOGPEN
{
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
} LOGPEN, *PLOGPEN, NEAR *NPLOGPEN, FAR *LPLOGPEN;
此函数对函数1参数进行了封装,意义完成一样;
3. HPEN ExtCreatePen(DWORD dwPenStyle, DWORD dwWidth, const LOGBRUSH* lplb, DWORD dwStyleCount, const DWORD* lpStyle)
dwPenStyle -- 其线条包括:类型,风格,末端样式,加入等每一组风格只选其一,风格与风格之间通过或“|”关联
线条类型:
PS_GEOMETRIC 几何画笔
PS_COSMETIC 逻辑画笔
线条风格:
PS_ALTERNATE
PS_SOLD
PS_DASH
PS_DOT
PS_DASHDOT
PS_NULL
PS_USERSTYLE
PS_INSIDEFRAME
末端样式:
PS_ENDCAP_ROUND
PS_ENDCAP_SQUARE
PS_ENDCAP_FLAT
加入样式:
PS_JOIN_BEVEL
PS_JOIN_MITER
PS_JOIN_ROUND
dwWidth -- 线宽, 若dwPenStyle 设有 PS_COSMETIC风格中,此参数只能为1
lplb -- 画刷, 若dwPenStyle 设有 PS_COSMETIC风格中, lplb->lbColor 为画笔颜色, lbStyle 必须设为BS_SOILD,
若dwPenStyle 设有PS_GEOMETRIC风格时,此参数为画刷参数
dwStyleCount -- 不作解释 0
lpStyle -- 不作解释 NULL
从名字中可以看出,此函数为函数1的增强函数,它不仅可以实现CreatePen与CreatePenIndirect所有功能,还扩展了它们不支持的功能如:增加了几何画笔, 有了几何画笔可以
绘制大于宽度1象素的不同线型。几何画笔比CreatePen/CreateIndirect在绘制速度要快。
以下图为线条样式: PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL, PS_INSIDEFRAME
二、画笔的使用
如所有的绘图对象一样,在使用前必须先选入到设备DC中,选入设备DC函数, SelectObject(HDC, HGIDOBJ), 看一下关键代码:
HPEN hOld = static_cast<HPEN>(SelectObject(hDC, hPen));
MoveToEx(hDC, rtGrid.left + 10, rtGrid.top + (ii + 1) * nHeight, NULL);
LineTo(hDC, rtGrid.right - 20, rtGrid.top + (ii + 1) * nHeight);
SelectObject(hDC, hOld);
DeleteObject(hPen);
SelectObject 函数在选入对应的绘图后会返回上一个相同类型的图形对象, 以便恢复原先的绘图对象以及释放被选入的绘图对象并可删除, 对象在使用后要记得删除.
三、画笔相关函数
SetDCPenColor -- Sets the current device context pen color.
使用此函数前需先将备用画笔DC_PEN选入DC中, SelectObject(hDC, GetStockObject(DC_PEN)) ;