Go homepage(回首页) Upload pictures (上传图片) Write articles (发文字帖)
The author:(作者)qqpublished in(发表于) 2014/7/9 22:40:14 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}; //线的类型CStringPenStyleName[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); //记录原画笔elsedc.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类使用实例
赞