本文转自: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
标 | 说 |
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 {
} LOGPEN;
其中,lopnStyle设定线型,lopnWidth设定线宽,lopnColor设定画线颜色。
4.CPen演示实例
(1)创建一个基于对话框的应用程序PenDemo。
(2)打开PenDemoDlg.cpp文件,找到CPenDemoDlg::OnDraw函数,修改这个函数的内容,如下所示:
void CCPenDlg::OnPaint()
{
//画线
}
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 | 线的结合部为圆形 |