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指定画笔的风格(样式),也就是画笔的线形。
参数crColor:包含了一个画笔所具有的RGB颜色
第三个构造函数带有5个参数,下面分别加以介绍:
参数nPenStyle:功能同上,除了具有上一个构造函数中介绍的参数值外,还增加了如下的参数值。
参数nWidth:含义基本与上一构造函数的同一参数含义相同,区别在于如果参数nPenStyle的值为PS_GEOMETRIC,那么该参数值是针对逻辑单位而言的,并且该参数值恒为1
参数pLogBrush:指向一个LOGBRUSH结构。该结构原型声明如下:
typedef struct tagLOGBURSH{
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
}LOGBRUSH;
该结构体定义了一个画刷的风格,颜色和限影线种类。lbStyle的值如下表
成员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
- CPen类
- CPen类
- CPen类
- 画笔类CPen
- MFC画笔CPen类
- CPen
- CPen
- CPen::CPen
- GDI画笔和CPen类
- 使用CPen类绘制指定直线
- 如何使用CPen类选择各种粗细的画笔?
- GDI绘图类示例代码-CFont CPen CBrush
- GDI绘图类示例代码-CFont CPen CBrush
- [MFC]CPen画笔类、CBrush画刷类使用介绍
- CPen,CBrush,
- MFC CPen
- CPEN使用
- 图形设备接口类,GDI类:CPen, CBrush,CFont,CBitmap,CRgn,CPalette等
- Windows Live SDK First App
- 简单控件使用--计算BMI的例子
- 1000 A + B Problem
- 1001 Sum Problem
- Oracle实现类似SQL SERVER列自增长功能
- CPen类
- MyEclipse 6.5 自动补全修改快捷键
- 数据中心服务在资源整合过程的实践
- 《鸟哥的linux》-第16章-例行性命令的建立
- wpf中调用w32的mfc dll 对话框
- 无法将类型为“System.Web.UI.LiteralControl”的对象强制转换为类型“System.Web.UI.WebControls.TextBox
- Eclipse+Tomcat 开发Java EE项目
- 人该怎样强大起来2
- 返回对象和返回对象的引用的区别···