CPen类

来源:互联网 发布:在宾夕法尼亚大学 知乎 编辑:程序博客网 时间:2024/05/16 13:00


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指定画笔的风格(样式),也就是画笔的线形。

参数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()函数来创建,其实这两个函数是可互换的。

void CMyPenView::OnPaint() {CPaintDC dc(this); // 用于绘制的设备上下文// TODO: 在此处添加消息处理程序代码// 不要为绘制消息而调用 CWnd::OnPaint()CDC* pDC=GetDC();for(int i=0;i<7;i++){//构造一支红色画笔CPen NewPen1(PS_SOLID+i,1,RGB(255,0,0));//也可以使用(COLORREF)0x000000FF来替代RGB宏CPen *pOldPen=pDC->SelectObject(&NewPen1);pDC->MoveTo(10,20*i+10);pDC->LineTo(700,20*i+10);pDC->SelectObject(pOldPen);}}

 

 

void CMyPenView::OnPaint() {CPaintDC dc(this); // 用于绘制的设备上下文// TODO: 在此处添加消息处理程序代码// 不要为绘制消息而调用 CWnd::OnPaint()CDC* pDC=GetDC();for (int i=0;i<7;i++){CPen NewPen2;//构造一支兰色画笔NewPen2.CreatePen(PS_SOLID,i,(COLORREF)0x00FF0000);CPen* pOldPen1=pDC->SelectObject(&NewPen2);pDC->MoveTo(10,160+20*i);pDC->LineTo(700,160+i*20);pDC->SelectObject(pOldPen1);}}

void CMyPenView::OnPaint() {CPaintDC dc(this); // 用于绘制的设备上下文// TODO: 在此处添加消息处理程序代码// 不要为绘制消息而调用 CWnd::OnPaint()CDC* pDC=GetDC();CPen NewPen3;//设置LOGPEN结构;LOGPEN lp;lp.lopnColor=(COLORREF)0x0000FF00;lp.lopnStyle=PS_SOLID;lp.lopnWidth.x=4;//创建画笔NewPen3.CreatePenIndirect(&lp);CPen* pOldPen2=pDC->SelectObject(&NewPen3);pDC->MoveTo(10,100);pDC->LineTo(700,100);pDC->SelectObject(pOldPen2);}


这里使用了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

原创粉丝点击