画笔类CPen

本文转自http://blog.sina.com.cn/s/blog_71f17cbd0100qsgn.html

 

画笔是一种基本的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);     //恢复原来的画笔

}

PS_SOLID

创建绘制实线的画笔

PS_DASH

创建绘制虚线的画笔(仅当线宽为1时有效)

PS_DOT

创建点线画笔(仅当线宽为1时有效)

PS_DASHDOT

创建点划线画笔(仅当线宽为1时有效)

PS_DASHDOTDOT

创建双点划线画笔(仅当线宽为1时有效)

PS_NULL

创建不画线的画笔

PS_INSIDEFRAME

创建可以在封闭区域中(矩形、椭圆等)画线的画笔,对于非封闭区域(线、弧等),画笔不受区域边框的限制

PS_GEOMETRIC

创建一个几何形状的画笔

PS_COSMETIC

创建一个化妆画笔

PS_ALTRENATE

创建一个设置每隔一位像素点的画笔,只使用于第③种构造函数类型

PS_USERSTYLE

创建一个用户自定义的画笔,只使用于第③种构造函数类型

PS_ENDCAP_ROUND

线的末端是圆形

PS_ENDCAP_SOUARE

线的末端是矩形

PS_ENDCAP_FLAT

线的末端是平的

PS_JOIN_BEVEL

线的结合部为锐角

PS_JOIN_MITER

当线的结合部分角度在::SetMiterLimit()规定的最大范围内,结合部斜角为45度,否则为锐角

PS_JION_ROUND

线的结合部为圆形

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值