CPen
画笔是绘图的基本工具,在MFC中画笔是CPen类的对象,它用来在DC上完成绘制线条的任务。初始化时,系统自动提供了一支黑色的默认画笔。如果程序设计人员对这个默认的画笔不满意,可以自己创建画笔来替换它。所谓的自定义画笔,就是程序员自己创建的CPen类对象,创建画笔对象是,需要使用CPen类的构造函数,它的原型为:
CPen(Int style,int width ,COLORREF color);
style:画笔的样式
width:画笔的宽度
color:画笔的颜色(颜色用RGB值来描述)
1.CPen类构造函数该类共重载了3个构造函数;
CPen( );
CPen(int nPenStyle, int nWidth, COLORREF crColor);
throw(CResourceException);
CPen(int nPenStyle, int mWidth, const LOGVRUSH* pLogBrush, int nStyleCount=0, const DWORD* lpStyle=NULL);
throw(CResourceException);
参数nPenStyle的值
参数值 注释
PS_SOLID 创建一个实线画笔
PS_DASH 创建一个虚线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
PS_DOT 创建一个点线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
PS_DASHDOT 创建一个点和虚线交替画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
PS_DASHDOTDOT 创建一个双点线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
PS_NULL 创建一个空线画笔
PS_INSIDEFRAME 创建一个内框线画笔,该画笔可以在WindowsGDI输出函数定义的矩形边界所生成的封闭形状的边框内绘制直线
PS_GEOMETRIC 创建一个几何画笔
PS_COSMETIC 创建一个装饰画笔
PS_ALTERNATE 创建一个设置其他像素的画笔
PS_USERSTYLE 创建一个使用由用户提供的风格矩阵的画笔
PS_ENDCAP_ROUND 尾帽为圆形的
PS_ENDCAP_SQUARE 尾帽为方形的
PS_ENDCAP—FLAT 尾帽为平坦的
PS_JOIN_BEVEL 成尖角连接
PS_JOIN_MITET 通过setMiterLimit函数设置的当前极限值范围内斜接;否则,成尖角连接
PS_JOIN_ROUND 成圆角连接
参数pLogBrush指向一个LOGBRUSH结构。该结构原型声明如下:
typedef struct tag LOGBRUSH{ /*lb*/
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
}LOGBRUSH;
该结构定义了一个画刷的风格、颜色和阴影线种类。
画刷的风格值
参数值 说明
BS_DIBPATTERN 由设备无关的位图定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB句柄
BS_DIBPATTERNPT 由设备无关的位图定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB指针
BS_HATCHED 阴影线画刷
BS_HOLLOW 中空画刷
BS_NULL 与参数值为BS_HOLLOW定义相同的画刷
BS_PATTERN 由内存位图定义的图形画刷
BS_SOLID 实画刷
BS_NULL 与参数值为BS_HOLLOW定义相同的画刷
BS_PATTERN 由内存位图定义的图形画刷
BS_SOLID 实画刷
2、CPen类初始化成员函数
(1)CreatePen( )成员函数其原型声明如下:
BOOL CreatePen(
int nPenStyle,
int nWidth,
const LOGBRUSH* pLogBrush,
int nStyleCount=0,
const DWORD*lpStyle=NULL
);
(2)CreatePenIndirect( )成员函数的原型声明如下:
BOOL CreatePenIndirect(LPLOGPEN lpLogPen);
LOGPEN结构的具体定义如下:
typedef struct tagLOGPEN{ // lgpn
UNIT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
}LOGPEN;
可以使用RGB宏来完成颜色设定:
COLORREF RGB(cRed,cGreen,cBlue);
也可以使用COLORREF,其结构为0x00bbggrr。
注:COLORREF实际上就是一个DWORD类型的。所有如果进行颜色传递直接按%d格式就可以,不需要格式的转换。
( XXT: 以上是我从别人的博客直接摘抄过来的,以供大家学习使用,版权归原作者——linger 所有)
3.CPen创建的例子
CPen pen1;
CPen *oldPen;
pen1.CreatePen(PS_SOLID,2,RGB(192,192,192));//创建对象
oldPen = pDC->SelectObject(&pen1);
pDC->MoveTo(10,10);
pDC->LineTo(200,20);
pDC->SelectObject(oldPen);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CPen::CPen
CPen();
CPen( int nPenStyle, int nWidth, COLORREF crColor );
throw( CResourceException );
CPen( int nPenStyle, int nWidth , const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );
throw( CResourceException );
参数:
nPenStyle
| 指定画笔的风格。在构造函数的第一个版本中,此参数可以取下列值之一:
PS_SOLID
| 创建一支实线画笔。
|
PS_DASH
| 创建一支虚线画笔。只有当画笔宽度为1或更小(以设备单位计算)时才有效。
|
PS_DOT
| 创建一支点线画笔。只有当画笔宽度为1或更小(以设备单位计算)时才有效。
|
PS_DASHDOT
| 创建一支虚线和点交替的画笔。只有当画笔宽度为1或更小(以设备单位计算)时才有效。
|
PS_DASHDOTDOT
| 创建一支虚线和两点交替的画笔。只有当画笔宽度为1或更小(以设备单位计算)时才有效。
|
PS_NULL
| 创建一支空画笔。
|
PS_INSIDEFRAME
| 创建一支画笔,该画笔在Windows GDI输出函数所产生的封闭形状的框架内画线,此输出函数指定一个限定矩形(例如,Ellipse,Rectangle,RoundRect,Pie和Chord成员函数),当此风格用于没有指定限定矩形的Windows GDI输出函数(例如LineTo成员函数)时,此画笔的绘制区域不受框架的限制。 | 第二种版本的CPen构造器指明了类型、风格、尾帽和连接等属性组合。来自每个类别的值应使用位操作符(|)组合起来。 笔的风格可以是下列之一:
PS_GEOMETRIC
| 创建一支几何画笔。
|
PS_COSMETIC
| 创建一支装饰画笔。CPen构造函数的第二个版本为nPenStyle添加了下列一些画笔风格:
|
PS_ALTERNATE
| 创建一支交替设置像素的画笔(此风格只用于装饰画笔)。
|
PS_USERSTYLE
| 创建一支使用用户提供的风格数组的画笔。 | 尾帽可以是下列值之一:
PS_ENDCAP_ROUND
| 尾帽是圆的。
|
PS_ENDCAP_SQUARE
| 尾帽是方的。
|
PS_ENDCAP_FLAT
| 尾帽是平面的。 | 连接可以是下列值之一:
PS_JOIN_BEVEL
| 连接是斜截式的。
|
PS_JOIN_MITER
| 当连接在::SetMiterLimit函数所设置的当前限制之内时,连接是斜接式的。如果连接超出这个限制则成为斜截式的。
|
PS_JOIN_ROUND
| 连接是圆的。 | |
·
| 对于构造函数的第一个版本来说,如果这个值是0,则不管是什么映射方式,以设备单位计算的宽度总是一个像素。
|
·
| 对于构造函数的第二个版本来说,如果nPenStyle是PS_GEOMETRIC,则宽度以逻辑单位给出。如果nPenStyle是PS_COSMETIC,则宽度必须设置为1。 |
crColor
| 包含了画笔的RGB值。
|
pLogBrush
| 指向一个LOGBRUSH结构。如果nPenStyle是PS_COSMETIC,则此LOGBRUSH结构的lbColor成员指定画笔的颜色,此LOGBRUSH结构的lbStyle成员必须设置为BS_SOLID。如果nPenStyle为PS_GEOMETRIC,则此结构的所有成员都必须用于指定画笔画刷属性。
|
nStyleCount
| 指定lpStyle数组的长度(以双字为单位)。如果nPenStyle不是PS_USERSTYLE,这个值必须是零。
|
lpStyle
| 指向一个双字值的数组。第一个值指定一个用户定义的风格中第一段虚线的长度,第二个值指定第一段空白的长度,如此等等。如果nPenStyle不是PS_USERSTYLE,则这个指针必须为NULL。 |
说明:
如果你使用的是没有参数的构造函数,你就必须用CreatePen,CreatePenIndirect或CreateStockObject成员函数来初始化所生成的CPen对象。如果你使用的是带参数的构造函数,则不再需要进一步的初始化。如果有错误发生,则带参数的构造函数可能会抛出一个异常,但是不带参数的构造函数则总是会成功。
请参阅:
CPen::CreatePen,
CPen::CreatePenIndirect,
CGdiObject::CreateStockObject
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。