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 使用总结 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • 与 for_each 或 std::transform 一起使用时,如何调用 C++ 函子构造函数

    我以前从未使用过 C 函子 所以我只是想了解它们是如何工作的 例如假设我们有这个函子类 class MultiplyBy private int factor public MultiplyBy int x factor x int ope
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • 是否可以使用 http url 作为 DirectShow .Net 中源过滤器的源位置?

    我正在使用 DirectShow Net 库创建一个过滤器图 该过滤器图通过使用 http 地址和 WM Asf Writer 来流式传输视频 然后 在网页上 我可以使用对象元素在 Windows Media Player 对象中呈现视频源
  • strlen() 编译时优化

    前几天我发现你可以找到编译时strlen使用这样的东西 template
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • MVC 5 中具有 ASP.NET Identity 的 Autofac 不会验证 OWIN 管道中的安全标记

    我在 MVC 5 中设置了 AutoFac 来与 ASP NET Identity 一起使用 表面上一切似乎都工作正常 即用户可以创建帐户并登录 但后来我发现 当安全标记更改时 用户不会注销 通过在 AspNetUsers 表中进行暴力破解
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 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