分享

CPen

 无云666 2012-01-10

CPen

CPen是绘图的基本工具,汉语意思是画笔。
  画笔是绘图的基本工具,在MFC中画笔是CPen类的对象,它用来在DC上完成绘制线条的任务。初始化时,系统自动提供了一支黑色的默认画笔。如果程序设计人员对这个默认的画笔不满意,可以自己创建画笔来替换它。所谓的自定义画笔,就是程序员自己创建的CPen类对象,创建画笔对象是,需要使用CPen类的构造函数,它的原型为:
  CPen(Int style,int width ,COLORREF color);
  style:画笔的样式   
  width:画笔的宽度
  color:画笔的颜色(颜色用RGB值来描述)

  1.CPen类构造函数该类共重载了3个构造函数;
  CPen( );
  CPen(int nPenStyle, int nWidth, COLORREF crColor);
  throw(CResourceException);


  CPen(int nPenStyle, int mWidth, const LOGVRUSH* pLogBrush, int nStyleCount=0, const DWORD* lpStyle=NULL);


  throw(CResourceException);


  参数nPenStyle的值


  参数值 注释


  PS_SOLID 创建一个实线画笔
  PS_DASH 创建一个虚线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
  PS_DOT 创建一个点线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
  PS_DASHDOT 创建一个点和虚线交替画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
  PS_DASHDOTDOT 创建一个双点线画笔,该值只有当画笔宽度等于1个设备单位或更小时才有效
  PS_NULL 创建一个空线画笔
  PS_INSIDEFRAME 创建一个内框线画笔,该画笔可以在WindowsGDI输出函数定义的矩形边界所生成的封闭形状的边框内绘制直线
  PS_GEOMETRIC 创建一个几何画笔
  PS_COSMETIC 创建一个装饰画笔
  PS_ALTERNATE 创建一个设置其他像素的画笔
  PS_USERSTYLE 创建一个使用由用户提供的风格矩阵的画笔
  PS_ENDCAP_ROUND 尾帽为圆形的
  PS_ENDCAP_SQUARE 尾帽为方形的
  PS_ENDCAP—FLAT 尾帽为平坦的
  PS_JOIN_BEVEL 成尖角连接
  PS_JOIN_MITET 通过setMiterLimit函数设置的当前极限值范围内斜接;否则,成尖角连接
  PS_JOIN_ROUND 成圆角连接


  参数pLogBrush指向一个LOGBRUSH结构。该结构原型声明如下:


  typedef struct tag LOGBRUSH{ /*lb*/
                                                 UINT lbStyle;
                                                 COLORREF lbColor;
                                                 LONG lbHatch;
                                                  }LOGBRUSH;


  该结构定义了一个画刷的风格、颜色和阴影线种类。
  画刷的风格值
  参数值 说明
  BS_DIBPATTERN 由设备无关的位图定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB句柄
  BS_DIBPATTERNPT 由设备无关的位图定义的图形画刷。如果该参数值为该值,则成员lbHatch包含了一个被压缩的DIB指针
  BS_HATCHED 阴影线画刷
  BS_HOLLOW 中空画刷
  BS_NULL 与参数值为BS_HOLLOW定义相同的画刷
  BS_PATTERN 由内存位图定义的图形画刷
  BS_SOLID 实画刷
  BS_NULL 与参数值为BS_HOLLOW定义相同的画刷
  BS_PATTERN 由内存位图定义的图形画刷
  BS_SOLID 实画刷


  2、CPen类初始化成员函数


  (1)CreatePen( )成员函数其原型声明如下:


  BOOL CreatePen(
                                    int nPenStyle,
                                    int nWidth,
                                   const LOGBRUSH* pLogBrush,
                                   int nStyleCount=0,
                                    const DWORD*lpStyle=NULL
                                         );


  (2)CreatePenIndirect( )成员函数的原型声明如下:

  BOOL CreatePenIndirect(LPLOGPEN lpLogPen);

  LOGPEN结构的具体定义如下:

  typedef struct tagLOGPEN{ // lgpn
                                        UNIT lopnStyle;
                                        POINT lopnWidth;
                                        COLORREF lopnColor;
                                      }LOGPEN;


  可以使用RGB宏来完成颜色设定:

  COLORREF RGB(cRed,cGreen,cBlue);
  也可以使用COLORREF,其结构为0x00bbggrr。
  注:COLORREF实际上就是一个DWORD类型的。所有如果进行颜色传递直接按%d格式就可以,不需要格式的转换。
  ( XXT: 以上是我从别人的博客直接摘抄过来的,以供大家学习使用,版权归原作者——linger 所有)


  3.CPen创建的例子


  CPen pen1;
  CPen *oldPen;
  pen1.CreatePen(PS_SOLID,2,RGB(192,192,192));//创建对象
  oldPen = pDC->SelectObject(&pen1);
  pDC->MoveTo(10,10);
  pDC->LineTo(200,20);
  pDC->SelectObject(oldPen);


 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
CPen::CPen

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 指定画笔的风格。在构造函数的第一个版本中,此参数可以取下列值之一:
PS_SOLID 创建一支实线画笔。
PS_DASH 创建一支虚线画笔。只有当画笔宽度为1或更小(以设备单位计算)时才有效。
PS_DOT 创建一支点线画笔。只有当画笔宽度为1或更小(以设备单位计算)时才有效。
PS_DASHDOT 创建一支虚线和点交替的画笔。只有当画笔宽度为1或更小(以设备单位计算)时才有效。
PS_DASHDOTDOT 创建一支虚线和两点交替的画笔。只有当画笔宽度为1或更小(以设备单位计算)时才有效。
PS_NULL 创建一支空画笔。
PS_INSIDEFRAME 创建一支画笔,该画笔在Windows GDI输出函数所产生的封闭形状的框架内画线,此输出函数指定一个限定矩形(例如,Ellipse,Rectangle,RoundRect,Pie和Chord成员函数),当此风格用于没有指定限定矩形的Windows GDI输出函数(例如LineTo成员函数)时,此画笔的绘制区域不受框架的限制。

第二种版本的CPen构造器指明了类型、风格、尾帽和连接等属性组合。来自每个类别的值应使用位操作符(|)组合起来。
笔的风格可以是下列之一:
PS_GEOMETRIC 创建一支几何画笔。
PS_COSMETIC 创建一支装饰画笔。CPen构造函数的第二个版本为nPenStyle添加了下列一些画笔风格:
PS_ALTERNATE 创建一支交替设置像素的画笔(此风格只用于装饰画笔)。
PS_USERSTYLE 创建一支使用用户提供的风格数组的画笔。

尾帽可以是下列值之一:
PS_ENDCAP_ROUND 尾帽是圆的。
PS_ENDCAP_SQUARE 尾帽是方的。
PS_ENDCAP_FLAT 尾帽是平面的。

连接可以是下列值之一:
PS_JOIN_BEVEL 连接是斜截式的。
PS_JOIN_MITER 当连接在::SetMiterLimit函数所设置的当前限制之内时,连接是斜接式的。如果连接超出这个限制则成为斜截式的。
PS_JOIN_ROUND 连接是圆的。

nWidth 指定画笔的宽度。
· 对于构造函数的第一个版本来说,如果这个值是0,则不管是什么映射方式,以设备单位计算的宽度总是一个像素。
· 对于构造函数的第二个版本来说,如果nPenStyle是PS_GEOMETRIC,则宽度以逻辑单位给出。如果nPenStyle是PS_COSMETIC,则宽度必须设置为1。

crColor 包含了画笔的RGB值。
pLogBrush 指向一个LOGBRUSH结构。如果nPenStyle是PS_COSMETIC,则此LOGBRUSH结构的lbColor成员指定画笔的颜色,此LOGBRUSH结构的lbStyle成员必须设置为BS_SOLID。如果nPenStyle为PS_GEOMETRIC,则此结构的所有成员都必须用于指定画笔画刷属性。
nStyleCount 指定lpStyle数组的长度(以双字为单位)。如果nPenStyle不是PS_USERSTYLE,这个值必须是零。
lpStyle 指向一个双字值的数组。第一个值指定一个用户定义的风格中第一段虚线的长度,第二个值指定第一段空白的长度,如此等等。如果nPenStyle不是PS_USERSTYLE,则这个指针必须为NULL。

说明:
如果你使用的是没有参数的构造函数,你就必须用CreatePen,CreatePenIndirect或CreateStockObject成员函数来初始化所生成的CPen对象。如果你使用的是带参数的构造函数,则不再需要进一步的初始化。如果有错误发生,则带参数的构造函数可能会抛出一个异常,但是不带参数的构造函数则总是会成功。

请参阅:
CPen::CreatePen, CPen::CreatePenIndirect, CGdiObject::CreateStockObject

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多