CPen画笔是一种用来画线及绘制有形边框的工具,用户可以指定它的颜色及厚度,并且可以指定它画实线、点线或虚线。
CPen类,该类封装了Windows图形设备接口(GDI)画笔,主要通过构造函数来创建绘图对象。
1构造CPen对象
该类共重载了3个构造函数,下面分别进行详细说明
CPen();
CPen(int nPenStyle,int nWidth,COLORREF crColor);
CPen(int nPenStyle,int nWidth,const LOGBRUSH* pLogBrush,int nStyleCount=0,const DWORD* lpStyle=NULL);
第一个构造函数不带任何参数,由于它所构造的只是一个未初始化的CPen对象。
第二个构造函数带有3个参数,分别对画笔的线形,线宽和颜色进行了初始化。
参数nPenStyle指定画笔的风格(样式),也就是画笔的线形。
参数值 | 注释 |
PS_SOLID | 创建一个实线画笔 |
PS_DASH | 创建一个虚线画笔,该值只有当画笔宽度小于1个设备单位或更小时才有效 |
PS_DOT | 同上 |
PS_DASHDOT | 同上 |
PS_DASHDOTDOT | 创建一个双点线画笔,该值只有当画笔宽度小于1个设备单位或更小时才有效 |
PS_NULL | 创建一个空线画笔 |
PS_INSIDEFRAME | 创建一个内框线画笔,该画笔可以在Windows GDI输出函数定义的矩形边界所生成的封闭状的边框内绘制直线 |
参数crColor:包含了一个画笔所具有的RGB颜色
第三个构造函数带有5个参数,下面分别加以介绍:
参数nPenStyle:功能同上,除了具有上一个构造函数中介绍的参数值外,还增加了如下的参数值。
新增的nPenStyle参数值
参数值 | 注释 |
PS_GEOMETRIC | 创建一个几何画笔 |
PS_COSMETIC | 创建一个装饰画笔 |
PS_ALTERNATE | 创建一个设置其他像素的画笔。(该风格只对装饰画笔可用) |
PS_USERSTYLE | 创建一个使用由用户提供的风格矩阵的画笔 |
PS_ENDCAP_ROUND | 端点为圆形的 |
PS_ENDCAP_SQUARE | 端点为方形的 |
PS_ENDCAP_FLAT | 端点为平坦的 |
PS_JOIN_BEVEL | 成尖角连接 |
PS_JOIN_MITER | 通过SetMiterLimit函数设置的当前极限值范围内斜接;否则,成尖角连接。 |
PS_JOIN_ROUND | 成圆角连接。 |
参数nWidth:含义基本与上一构造函数的同一参数含义相同,区别在于如果参数nPenStyle的值为PS_GEOMETRIC,那么该参数值是针对逻辑单位而言的,并且该参数值恒为1
参数pLogBrush:指向一个LOGBRUSH结构。该结构原型声明如下:
typedef struct tagLOGBURSH{
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
}LOGBRUSH;
该结构体定义了一个画刷的风格,颜色和限影线种类。lbStyle的值如下表
画刷的风格值
参数值 | 说明 |
BS_DIBPATTERN | 由设备无关的位图(DIB)定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB的句柄 |
BS_DIBPATTERNPT | 由设备无关的位图(DIB)定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB的指针 |
BS_HATCHED | 阴影线画刷 |
BS_HOLLOW | 中空画刷 |
BS_NULL | 与参数值为BS_HOLLOW定义相同的画刷 |
BS_PATTERN | 由内存位图定义的图形画刷 |
BS_SOLID | 实画刷 |
成员lbColor指定了所指定画刷的颜色。
成员lbHatch指定了阴影线画刷的阴影线的样式。
如果参数nPenStyle的值为PS_COSMETIC,那么LOGBRUSH结构的成员变量lbColor指定画笔的颜色,成员变量lbStyle必须被为BS_SOLID.如果参数nPenStyle的值为PS_GEOMETRIC,那么所有的成员变量必须被有来指定画笔的刷子属性。
参数nStyleCount:以双字为一个单元指定lpStyle矩阵的长度。如果参数nPenStyle的值不是PS_USRSTYLE,则该参数值必为0
参数lpStyle:指向一个双字为单元的矩阵。第一个值以用户定义的风格指定了第一个直线段的长度。第二个值指定了第一个空隙的长度等。如果参数nPenStyle的值不是PS_USERSTYLE,那么这个指针必为空
1.3.1.2初始化CPen对象
下面介绍另外几种方法来创建和初始化画笔对象
调用CreatePen成员函数
CreatePen()成员函数通过指定线形、线宽和颜色等画笔属性参数直接创建一个具有特定线形、线宽和颜色的画笔对象,其原型声明如下:
BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);
BOOL CreatePen(int nPenStyle,int nWidth,const LOGBRUSH* pLogBrush,int nStyleCount=0,const DWORD* lpStyle=NULL);
所有参数的含义与上面介绍的一样
调用CreatePenIndirect()成员函数
CreatePenIndirect()成员函数创建画笔对象,其属性并不是直接通过函数参数的形式给出的,而是通过LOGPEN结构的成员变量间接的给出。为了创建一个具有特定属性的画笔对象主要工作是重置LOGPEN结构的成员变量,该函数的原型声明如下:
BOOL CreatePenIndirect(LPLOGPEN lpLogPen);
参数lpLogPen是指向LOGPEN结构的指针,在该结构中有3个成员变量,分别用于指定画笔的风格、宽度和颜色。LOGPEN结构的具体定义如下:
typedef struct tagLOGPEN{
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
}LOGPEN;
第二个成员变量lopnWidth虽然也是用于指定画笔的宽度,但其类型却是POINT结构,在该结构中的y成员变量不起任何作用,只采用x成员变量来表示画笔宽度。
在实际使用中,既可以使用CreatePenIndirect()函数来创建画笔对象,也可以使用CreatePen()函数来创建,其实这两个函数是可互换的。
这里使用了32位的COLORREF类型值来确定图形颜色值,其结构为0x00bbggrr,
各部分的数值分别说明如下:
bb代表蓝色值,范围从00到FF
gg代表绿色值,范围从00到FF
rr 代表红色值,范围从00到FF
同时我们还可以使用RGB宏来完成相同的功能,使用方法说明如下:
RGB(short red,short green,short blue)
red代表红色值,范围从0到255
green代表绿色值,范围从0到255
blue代表蓝色值,范围从0到255