如何精确测量绳子的宽度?

2023-11-23

首先,问一个问题How to measure width of character precisely?这是回答,对于这种情况并没有真正的帮助,所以这不是那个的重复.

我有一根绳子。我画画使用graphics.DrawString,但是当我需要在其后放置另一个字符串时,我需要知道前一个字符串的精确宽度。

为此,我使用graphics.MeasureString:

StringFormat format = new StringFormat(StringFormat.GenericTypographic);
format.Alignment = StringAlignment.Center;
format.Trimming = StringTrimming.None;
format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;

我尝试过很多其他功能,就像TextRendered.MeasureText然而,所有可能的参数组合都失败了。

提到的 MeasureString 组合最接近我需要的(它在大多数情况下都有效,特殊字符除外),但是使用像 # 这样的字符会破坏它。宽度要么更短,要么更长。

有没有办法获得 DrawString 函数生成的文本的精确大小? DrawString如何计算绘图区域的大小?它显然一定是其他函数,因为大小总是不同的。

整个应用程序的源代码在这里https://gitorious.org/pidgeon/pidgeon-main/(我使用这个的文件是https://gitorious.org/pidgeon/pidgeon-main/blobs/master/scrollback/SBABox.cs)


您只需要消除多余的宽度即可。您可以通过使用来做到这一点字符串格式:

GdipStringFormatGetGenericTypographic()

您还可以使用:

float doubleWidth = g.MeasureString(text+text,...).Width;
float singleWidth = g.MeasureString(text).Width;
float textWidth = doubleWidth-singleWidth;

这将允许您使用其他语言,例如日语.

在代码项目上,Pierre Anaud 的解决方案是使用MeasureCharacterRanges,它返回与指定字符串的边界框完全匹配的区域:

static public int MeasureDisplayStringWidth(Graphics graphics, string text, Font font)
{
    System.Drawing.StringFormat format  = new System.Drawing.StringFormat ();
    System.Drawing.RectangleF   rect    = new System.Drawing.RectangleF(0, 0, 1000, 1000);
    var ranges  = new System.Drawing.CharacterRange(0, text.Length);
    System.Drawing.Region[] regions = new System.Drawing.Region[1];

    format.SetMeasurableCharacterRanges (ranges);

    regions = graphics.MeasureCharacterRanges (text, font, rect, format);
    rect    = regions[0].GetBounds (graphics);

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

如何精确测量绳子的宽度? 的相关文章

随机推荐

  • 如何在 java 8 中展平地图列表

    我有要求 我有地图列表 Men 1 Men 2 Women 3 Women 2 Boys 4 现在我需要将其设为 flatMap 使其看起来像 Gender countOfValues 在上面的例子中 输出将是 Men 3 Women 5
  • 在java中读取Excel工作表时出现NoSuchFieldError

    我遵循了使用 Apache POI XSSF 构建工作簿的简单指南 按照相同的指南 我能够编写 Excel 工作表 但是当尝试读取 Excel 工作表时 我收到代码后显示的错误 Code try FileInputStream file n
  • 反序列化集合时未调用 Setter

    我正在尝试使用 XmlSerializer 进行非常简单的序列化 public struct XmlPerson XmlAttribute public string Id get set XmlAttribute public strin
  • 使用 LINQ to SQL 存储图像:将字节数组或流转换为二进制

    我正在使用 LINQ to SQL 我的图像字段被视为二进制 当我需要渲染图像时 将 Binary 类型转换为 byte 您可以使用 Binary 对象的 ToArray 方法 并不是什么大问题 但是有人可以告诉我如何将 byte 或将对象
  • 为 PerSession WCF 服务调用两次静态构造函数

    无法理解为什么类型构造函数PerSession WCF 服务调用了两次 ConcurrencyMode is Multiple 只需启动五个同时执行相同 WCF 服务方法调用的客户端 在日志中我看到static构造函数被调用两次 第一次 3
  • 使用(自定义)GCC 4.x 或 5.x 时,Boost 构建无法通过 C++11 功能检查

    我需要在 Fedora 24 机器上构建 Boost 1 62 和 1 63 但使用 GCC 4 9 3 或 GCC 5 4 0 取决于 CUDA 版本 这就是我需要旧编译器的原因 但是如果我按照中所述设置自定义 GCC 版本这个答案 an
  • 如何在Tensorflow 2.0中使用gradient_override_map?

    我正在尝试使用gradient override map与张量流2 0 有一个文档中的示例 我也将在这里用作示例 In 2 0 GradientTape可用于计算梯度 如下所示 import tensorflow as tf print t
  • 在 SDK 工具修订版 12 中启动 Android 模拟器

    我将 Android SDK 工具从修订版 11 更新到修订版 12 模拟器现在无法启动 当我尝试运行 emulator exe 时 我得到 无效的命令行参数 Files Android android sdk tools emulator
  • 为什么音频和视频事件不冒泡?

    我想知道为什么我的一些 Javascript 无法工作 直到我发现音频事件没有在 DOM 树中冒泡 例如这timeupdate event 是否有理由不让音频和视频标签的事件冒泡 事件冒泡存在的原因是为了解决哪个元素是事件的预期目标这一含糊
  • 序言。结构(复杂术语)和谓词,我真的不明白区别

    我是序言新手 我似乎无法理解结构和谓词之间的区别 真的有什么区别吗 在四处挖掘时 我发现有些人认为f X a X 是一个谓词 有些人认为嫉妒 X Y 爱 X Z 爱 Y Z 是一个结构 或一个复杂的术语 他们对我来说看起来几乎一样 有人愿意
  • Android 上使用 SoundPool 实现无缝循环?

    我尝试使用 SoundPool 类循环短 20kb 无间隙 ogg 文件 但在硬件测试时无法获得一致的结果 它总是使用模拟器完美播放 但当我在 Nexus 1 或 Samsumg Galaxy Tab 10 1 上进行测试时 每个循环点都会
  • 手动生成条令段

    我在 Symfony2 项目中使用 slugable 行为 但现在我想根据不同的文本 当前标题 旧标题 表单输入中的用户文本 为一个页面制作许多 slugs 并将其保留在另一个页面中桌子 我的问题是 如何手动使用任何文本的学说扩展 我到处都
  • 大数据读取子样本R

    我非常感谢您花时间阅读本文 我有一个 30GB 的超级文件 其中包含 600 万条记录和 3000 个 csv 格式的列 主要是分类数据 我想引导子样本进行多项回归 但事实证明 即使我的机器中有 64GB RAM 和两倍的交换文件 这个过程
  • 在 XHTML 1.1 中:元素“input”不能嵌套在元素“form”内。为什么?

    下面的代码在 XHTML 1 1 严格模式下是被禁止的
  • python 中仅按第一个空格分割字符串[重复]

    这个问题在这里已经有答案了 我有字符串例如 238 NEO Sports 我只想在first空间 输出应该是 238 NEO Sports 我能想到的一种方法是使用split 最后合并返回的最后两个字符串 有没有更好的办法 只需将计数作为第
  • 如何从java执行https GET请求

    我写了一个Java客户端 它执行httpGET 请求没有任何问题 现在我想修改这个客户端以便执行https获取请求 import org apache http HttpHost import org apache http auth Au
  • Angular 6 复选框过滤器

    我想使用复选框通过变量 类别 过滤 JSON 对象 产品 列表 产品如下 bikeId 6 bikeName Kids blue bike bikeCode KB 3075 releaseDate June 28 2016 descript
  • Fortran - 在运行时设置变量的种类/精度

    是否可以将变量本身的精度设置为将在运行时定义的变量 假设我尝试编译 SUBROUTINE FOO VARIABLE PRECISION VALUE IMPLICIT NONE INTEGER 4 PRECISION VALUE INTEGE
  • IIS 返回 404 未找到 .mp4 文件

    我使用 html video 标签来播放视频 在我的本地主机中视频播放 但是当我发布 没玩过 我已经创建了基于ASP NET的项目 我在本地使用类似这种方法 http localhost 41563 files Just mp4 当我发布网
  • 如何精确测量绳子的宽度?

    首先 问一个问题How to measure width of character precisely 这是回答 对于这种情况并没有真正的帮助 所以这不是那个的重复 我有一根绳子 我画画使用graphics DrawString 但是当我需