GDI+ 中 Pen 使用总结

背景

图形类 Graphics 是 GDI+的核心,它提供绘制图形、图像和文本的各种方法。Graphics 中使用 DrawString 方法在指定位置绘制文本或者在一个指定矩形内绘制文本。

所有的 Graphics 类的绘制方法都得配合 Pen 对象使用。因此为了绘制任何东西,必须至少创建 2 个对象:一个 Graphics 对象和一个 Pen 对象。

笔对齐设置

①.概述

笔对齐主要用于在设定一个矩形范围后,画笔的中心以何种方式和矩形边界对齐。

②.对齐设置

在缺省情况下是以笔的中心与绘图坐标对齐,也可以调用 Pen 类的成员函数SetAlignment进行对齐设置。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象

  Pen blackPen(Color(255, 0, 0, 0), 1);
  Pen greenPen(Color(155, 0, 255, 0), 10);
  
  //缺省为中心对齐
  {
    graphics.DrawRectangle(&blackPen, 10, 10, 160, 200);
    graphics.DrawRectangle(&greenPen, 10, 10, 160, 200);
  }
  //设置内对齐
  {
    graphics.TranslateTransform(170, 0);
    graphics.DrawRectangle(&blackPen, 10, 10, 160, 200);
    greenPen.SetAlignment(PenAlignmentInset);
    graphics.DrawRectangle(&greenPen, 10, 10, 160, 200);
  }
    
}

在这里插入图片描述

线型设置

①.概述

在缺省情况下,Pen 绘制的线条为实线,可以通过调用其成员函数 SetDashStyle 来设置线型。DashStyle 为一系列枚举常量:

enum DashStyle { 
 DashStyleSolid, // 0 实线:(缺省值) 
 DashStyleDash, // 1 虚线:
 DashStyleDot, // 2 点线:
 DashStyleDashDot, // 3 虚点线:
 DashStyleDashDotDot, // 4 虚点点线:
 DashStyleCustom // 5 自定义虚线:
};

②.自定义虚线

可以通过调用其成员函数 SetDashPattern 来设置自定义虚线样式,其中传入的参数表示的是按线、空、线、空交叉排列的数组,单位为像素;

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象

  Pen m_Pen(Color::Green, 10);
  
  //线型1
  {
    float dashPattern[] = { 4,4,4,4 };
    m_Pen.SetDashPattern(dashPattern, 4);
    graphics.DrawLine(&m_Pen, 20, 20, 400, 20);
  }
  //线型2
  {
    graphics.TranslateTransform(0, 40);
    float dashPattern[] = { 0.1f,4,4,4 };
    m_Pen.SetDashPattern(dashPattern, 3);
    graphics.DrawLine(&m_Pen, 20, 20, 400, 20);
  }
    
}

在这里插入图片描述

如上图,可以通过定时器交替绘制两种交错的线型,即可实现线条流动的效果。

线帽设置

①.概述

线帽是指线条两端的外观,缺省为正方形。通过调用SetStartCap、Status SetEndCap 可以设置首位线端的形状。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象

  Pen m_Pen(Color::Green, 10);
  
  //缺省
  {
    graphics.DrawLine(&m_Pen, 20, 20, 400, 20);
  }
  //线型2
  {
    graphics.TranslateTransform(0, 40);
    m_Pen.SetStartCap(LineCapRoundAnchor);//圆点
    m_Pen.SetEndCap(LineCapArrowAnchor);//箭头
    graphics.DrawLine(&m_Pen, 20, 20, 400, 20);
  }
    
}

在这里插入图片描述

②.可调节箭头类线帽

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象

  Pen m_Pen(Color::Green, 10);
  
  AdjustableArrowCap  cap(9, 5, true);
  m_Pen.SetCustomEndCap(&cap);
  graphics.DrawLine(&m_Pen, 20, 60, 400, 60);
    
}

在这里插入图片描述

③.自定义线帽

使用类 CustomLineCap 可以自定义线帽形状,自定义线帽所使用的坐标系 y 轴为绘图坐标系中的 x 轴。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象

  Pen m_Pen(Color::Green, 4);
  
  GraphicsPath endpath; 
  endpath.AddLine(0,0,2,-8);
  endpath.AddLine(2,-8,0,-6);
  endpath.AddLine(0,-6,-2,-8);
  endpath.AddLine(-2,-8,0,0);
  CustomLineCap endcap(nullptr, &endpath);

  m_Pen.SetCustomEndCap(&endcap);
  graphics.DrawLine(&m_Pen, 20, 60, 400, 60);
    
}

在这里插入图片描述

④.虚线线帽

函数 SetLineCap 的最后一个输入参数 DashCap 用于设置虚线内部各线段端点的形状。

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象
  Pen m_Pen(Color::Green, 10);

  float dashPattern[] = { 1,2,4,2 };
  m_Pen.SetDashPattern(dashPattern, 4);

  //圆形
  {  
    m_Pen.SetLineCap(LineCapFlat, LineCapFlat, DashCapRound);  
    graphics.DrawLine(&m_Pen, 20, 20, 400, 20);
  }
  //三角形
  {
    graphics.TranslateTransform(0, 40);
    m_Pen.SetLineCap(LineCapFlat, LineCapFlat, DashCapTriangle);
    graphics.DrawLine(&m_Pen, 20, 20, 400, 20);
  }
}

在这里插入图片描述

T

线连接设置

①.概述

直线连接点是两条端点重合或者重叠的直线形成的公共区域。通过调用成员函数 SetLineJoin来设置笔的线连接属性。

②.设置连接点

void DemoGDI::DrawUser(HDC hdc)
{
  Graphics graphics(hdc);//构造 Graphics 对象
  Pen m_Pen(Color::Green, 12);
  
  //缺省
  {
    graphics.DrawRectangle(&m_Pen, 20,20,60,60);
  }
  //斜截
  {
    graphics.TranslateTransform( 80, 0);
    m_Pen.SetLineJoin(LineJoinBevel);
    graphics.DrawRectangle(&m_Pen, 20, 20, 60, 60);
  }
  //圆角
  {
    graphics.TranslateTransform(80, 0);
    m_Pen.SetLineJoin(LineJoinRound);
    graphics.DrawRectangle(&m_Pen, 20, 20, 60, 60);
  }    
}

在这里插入图片描述

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值