Go homepage(回首页)
Upload pictures (上传图片)
Write articles (发文字帖)

The author:(作者)qq
published in(发表于) 2014/7/9 22:40:14
visual c++中的画笔类CPen使用实例

visual c++中的画笔类CPen使用实例

画笔类CPen

画笔是一种基本的GDI对象,在绘图之前,一般要为所绘制的图形选择定制的笔。MFC提供的一种名为CPen的包装类,使得使用画笔非常简单。

画笔由CPen类管理,使用CPen类对象时,需用对CPen类对象进行初始化。初始化CPen类的方法有3种:第1种是调用CPen()的构造函数;第2种是通过CPen::CreatePen()函数创建;第3种是通过CPen::CreatePenIndirect()函数,并通过LPLOGPEN结构来设置CPen的属性。

1.CPen的构造函数

CPen类的构造函数有3种形式,具体如下:

① 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:线型,具体取值如表1所示。



表1 nPenStyle取值说明

n_Width:线宽,对于第②种构造函数,如果取值为0,则线宽永远为1个像素宽,与显示模式无关。对于第③种构造函数,如果线型为PS_GEOMETRIC,则线宽以逻辑单位度量;如果线型为PS_COSMETIC,线宽必须为1。

crColor:画线颜色。

polgBrush:为LOGBRUSH结构指针,如果nPenStyle为PS_COSMETIC,则LOGGBRUSH的lbColor成员变量设定画笔颜色,而LOGBRUSH的lbStyle成员变量必须是PS_SOLID。如果nPenStyle为PS_GEOMETRIC,所有的成员变量都必须用于指定画笔的画刷属性。

nStyles:指定线型类型的树目,即lpStyle数组的元素数目,只对PS_USERSTYLE类型的线型有效。对于其他线型,该项必须是0。

lpStyle:一个双字节(DWORD)的数组,数组的第1个元素设定第1个笔画的长度,第2个元素设定第一个间隔的长度,当笔画属性不是PS_USERSTYLE时,该项必须为0。

2.使用CreatePen()创建画笔

使用CPen::CreatePen()函数来创建画笔的方法与使用CPen类的构造函数创建画笔的方法类似,这里不再重复。

3.使用CreatePenIndirect()创建画笔

CreatePenIndirect()成员函数通过LPLOGPEN结构来生成CPen类对象,LPLOGPEN结构的定义如下所示:

typedef struct tagLOGPEN {

UINT lopnStyle;

POINT lopnWidth;

COLORREF lopnColor;

} LOGPEN;

其中,lopnStyle设定线型,lopnWidth设定线宽,lopnColor设定画线颜色。

4.CPen演示实例

(1)创建一个基于对话框的应用程序PenDemo。

(2)打开PenDemoDlg.cpp文件,找到CPenDemoDlg::OnDraw函数,修改这个函数的内容,如下所示:

void CCPenDlg::OnPaint()

{

CPaintDC dc(this);

//绘制白色背景

CRect rect;

this->GetClientRect(&rect);

CBrush brush;

brush.CreateSolidBrush(RGB(255,255,255));

dc.FillRect(&rect,&brush);

brush.DeleteObject();

//画线

CPen * pOldPen; //记录原始画笔

const int nLeft=30;

CPen LinePen;

long PenStyle[8]={PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDOT,

PS_SOLID,PS_SOLID,PS_SOLID}; //线的类型

CString

PenStyleName[8]={"SOLID","DASH","DOT","DASHDOT","DASHDOTDOT","Width=10",

"Width=20","Width=30"}; //显示的提示文本

int nsize[8]={1,1,1,1,1,10,20,30}; //线的宽度

for(int i=0;i<8;i++)

{

dc.TextOut(nLeft,(i+1)*30,PenStyleName[i]); //绘制提示文本

LinePen.CreatePen(PenStyle[i],nsize[i],RGB(255,0,0)); //建立CPen对象

if(i==0)

pOldPen=dc.SelectObject(&LinePen); //记录原画笔

else

dc.SelectObject(&LinePen);

dc.MoveTo(140,(i+1)*30+10);

dc.LineTo(340,(i+1)*30+10); //画线

LinePen.DeleteObject(); //释放CPen类对象所占的存储空间

}

dc.SelectObject(pOldPen); //恢复原来的画笔

}

(3)运行结果如图1所示。



图1 CPen类使用实例




If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)





QQ:154298438
QQ:417480759