GDI+ 中 Pen 使用总结

2023-11-17

背景

图形类 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);
  }    
}

在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDI+ 中 Pen 使用总结 的相关文章

  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • Github账号开启账号双重验证

    Github账号开启账号双重验证 发现问题 解决步骤 插件使用 发现问题 今天在浏览开源项目的时候 突然Github有个提示我要在10月12日前开启双重验证 说是不完成的话 到时候的Github账号会受到限制 如下图 通过设置也可以找到 解
  • win11设置任务栏不合并的方法教程

    win11系统的任务栏窗口默认设置是合并的 有些小伙伴表示用起来还不太习惯 那么win11任务栏怎么设置不合并呢 下面小编为大家分享下win11设置任务栏不合并的方法 感兴趣的小伙伴一起来看看吧 win11设置任务栏不合并的方法教程 1 我
  • Elasticsearch学习笔记2:ES核心概念 -- 索引、倒排索引、类型、文档

    一 ES和关系型数据库的对比 Elasticsearch Relational DB 索引 index 数据库 database 类型 types 表 tables 文档 documents 行 rows 字段 fields 列 colum
  • OLED透明屏报价:实现高质量展示的成本与选择

    引言 OLED透明屏作为商业展示领域的新兴技术 受到了广泛的关注和需求 然而 对于OLED透明屏的报价 人们常常存在疑虑 在这篇文章中 尼伽将详细解析OLED透明屏报价的构成和选择因素 希望能帮助您更好呢地了解OLED透明屏 一 OLED透
  • vue中textarea高度的设置_vue中textarea自适应高度

    HTML data return pltxt 评论 inputText isHeight true minHeight 0 methods autoTextarea var extra 0 设置光标与输入框保持的距离 默认0 maxHeig
  • SQL操作

    一 查询语句 1 基本查询 SELECT FROM lt 表名 gt 查询表的所有行 SELECT FROM students 2 条件查询 SELECT FROM lt 表名 gt WHERE lt 条件表达式 gt 查询分数在80分以上
  • vscode+phpstudy连接使用mysql(解决phpstudy中mysql无法启动的问题)

    vscode phpstudy连接使用mysql 解决phpstudy中mysql无法启动的问题 使用vscode phpstudy配置php开发环境网上很文章都是挺好的 都成功解决了我的问题 但是对于使用mysql方面始终找不到很系统的文
  • 数据结构系列——先进先出队列queue

    本期主题 先进先出队列实现 目录 1 队列定义 2 实现一个简单的队列以及分析 1 代码实现分析 2 code 3 优缺点分析 3 循环队列实现 1 循环队列原理 2 循环队列实现分析 3 code 1 队列定义 队列是什么 定义 一个先进
  • unity,网格碰撞器(Mesh Collider)

    介绍 网格碰撞器 Mesh Collider 在实现物理碰撞检测时 可以自动检测凸面 但是它并不总是能够准确地生成凸多面体 这是因为在将一个网格模型转换为凸多面体的过程中 可能会出现模型内部空洞或者交叉的情况 这些情况会导致凸多面体的生成失
  • H5页面长按识别二维码

    vue 写的H5 内嵌在小程序上 img src 图片路径 style width 200px height 200px 直接在微信访问长按就可以实现 微信原生直接写长按识别二维码 aaa e let img e target datase
  • 八. springboot 的指标监控 (3、定制 Endpoint )

    3 定制 Endpoint 3 1 定制 Health 信息 import org springframework boot actuate health Health import org springframework boot act
  • http、https以及状态码超全详解

    文章目录 HTTP 概念 作用 http 请求 http 头部 http 连接 各版本的区别 http1 0 http1 1 http2 0 http3 0 HTTPS 概念 作用 工作原理 优点 缺点 http 和 https 区别 ht
  • [网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster原理详解

    Web渗透技术的核心是发现Web漏洞 发现漏洞有手工和软件自动化扫描两种方式 对于用户验证漏洞 用户凭证管理问题 权限特权及访问控制漏洞 缓存漏洞 跨站脚本漏洞 加密漏洞 路径切换漏洞 代码注入漏洞 配置漏洞 数据和信息泄露 输入验证码漏洞
  • CA证书服务搭建

    准备一 域服务搭建 步骤一 搭建CA证书服务器 设置固定IP地址 192 168 0 与主机名 DC 打开服务器管理器 gt 点击添加角色和功能 步骤二 一路回车到达选择服务器角色位置 选中Active Directory域服务与Activ
  • 动态库装载及 dlsym的RTLD_NEXT参数详解

    在看公司spp框架代码的时候发现了如下一段宏定义 其中的dlsym函数及其RTLD NEXT参数的含义不是很明白 于是网上搜了下这里做个记录 define mt hook syscall name do if g mt syscall ta
  • 扔掉工具类!MyBatis 一个简单配置搞定加密、解密,好用!

    程序员的成长之路 互联网 程序员 技术 资料共享 关注 阅读本文大概需要 3 5 分钟 来自 https juejin cn post 6963811586184052767 目录 一 背景 二 解决方案 三 需求 四 实现思路 五 实现代
  • spring cloud alibaba 学习(二十五)nacos 服务地址动态更新

    目录 前言 服务地址动态更新 前言 通过配置endpoint来实现服务地址的动态更新 服务地址动态更新 1 在 NacosConfigBootstrapConfiguration 创建 NacosConfigManager 的过程中 会创建
  • Unity PlayerPrefs、JsonUtility

    Unity中有两个常用的数据存储方式 PlayerPrefs和JsonUtility PlayerPrefs PlayerPrefs是Unity内置的一种轻量级数据存储方式 可用于存储少量的游戏数据 如分数 解锁状态等 使用PlayerPr
  • LPDDR4协议规范之 (六)刷新

    LPDDR4协议规范之 六 刷新 刷新命令 刷新计数器 刷新时序 刷新前时序 刷新后时序 全存储体刷新时序 tRFCab tRFCpb 自刷新 自刷新期间进入掉电模式 自刷新中止 刷新命令 REFRESH命令在时钟的第一个上升沿以CS HI
  • GDI+ 中 Pen 使用总结

    背景 图形类 Graphics 是 GDI 的核心 它提供绘制图形 图像和文本的各种方法 Graphics 中使用 DrawString 方法在指定位置绘制文本或者在一个指定矩形内绘制文本 所有的 Graphics 类的绘制方法都得配合 P