计算字符串宽度(以像素为单位)以模拟自动换行时出现奇怪的行为

2023-12-09

尝试获取 C# 中的字符串宽度来模拟自动换行和文本位置(现在用 richTextBox 编写)。

richTextBox 的大小是 555x454 px,我使用等宽字体 Courier New 12pt。

I tried TextRenderer.MeasureText()并且Graphics.MeasureString()方法。

TextRenderer返回的值大于Graphics因此,通常适合一行的文本,我的代码确定应该换行到另一行。

但随着使用Graphics另一方面,我的代码确定特定字符串比原始 richTextBox 中打印的字符串短,因此它被包装到错误位置的下一行。

在调试过程中,我发现计算的宽度不同,这很奇怪,因为我使用等宽字体,所以所有字符的宽度应该相同。但我从那里得到这样的东西Graphics.MeasureString()(例如:“ ” - 5.33333254、“S” - 15.2239571、“\r” - 5.328125)。

如何使用 C# 准确计算字符串宽度,从而模拟自动换行并确定像素中的特定文本位置?

为什么使用等宽字体时不同字符的宽度不同?

注意:我正在开展个人眼动追踪项目,我想确定实验期间特定文本片段的放置位置,以便我可以判断用户正在查看哪些单词。对于前。在某个时间t用户正在查看点 [256,350]px,我知道在这个地方有方法的调用WriteLine。 我的目标视觉刺激是源代码,带有缩进、制表符、行结尾,放置在一些可编辑的文本区域中(将来可能是一些简单的在线源代码编辑器)。

这是我的代码:

    //before method call
    var font = new Font("Courier New", 12, GraphicsUnit.Point);
    var graphics = this.CreateGraphics();
    var wrapped = sourceCode.WordWrap(font, 555, graphics);

    public static List<string> WordWrap(this string sourceCode, Font font, int width, Graphics g)
        {
            var wrappedText = new List<string>(); // output
            var actualLine = new StringBuilder();
            var actualWidth = 0.0f; // temp var for computing actual string length
            var lines = Regex.Split(sourceCode, @"(?<=\r\n)"); // split input to lines and maintain line ending \r\n where they are
            string[] wordsOfLine;

            foreach (var line in lines)
            {
                wordsOfLine = Regex.Split(line, @"( |\t)").Where(s => !s.Equals("")).ToArray(); // split line by tabs and spaces and maintain delimiters separately

                foreach (string word in wordsOfLine)
                {
                    var wordWidth = g.MeasureString(word, font).Width; // compute width of word

                    if (actualWidth + wordWidth > width) // if actual line width is grather than width of text area
                    {
                        wrappedText.Add(actualLine.ToString()); // add line to list
                        actualLine.Clear(); // clear StringBuilder
                        actualWidth = 0; // zero actual line width
                    }

                    actualLine.Append(word); // add word to actual line
                    actualWidth += wordWidth; // add word width to actual line width
                }

                if (actualLine.Length > 0) // if there is something in actual line add it to list
                {
                    wrappedText.Add(actualLine.ToString());
                }
                actualLine.Clear(); // clear vars
                actualWidth = 0;
            }

            return wrappedText;
        }

我相信通过获取屏幕上给定位置下的角色来完成您的任务要容易得多。例如,如果您使用的是 RichTextBox 控件,请参阅RichTextBox.GetCharIndexFromPosition方法获取最接近指定位置的字符的索引。下面是一些演示这个想法的示例代码:

private void richTextBox1_MouseMove(object sender, MouseEventArgs e)
{
    var textIndex = richTextBox1.GetCharIndexFromPosition(e.Location);
    if (richTextBox1.Text.Length > 0)
        label1.Text = richTextBox1.Text[textIndex].ToString();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算字符串宽度(以像素为单位)以模拟自动换行时出现奇怪的行为 的相关文章

  • 分层架构中的异常处理

    我们正在分层设计中重构 当然还有重新设计 我们的服务 我们有服务操作层 BLL 网络抽象层 gt 处理网络代理 数据抽象层 但我们对我们的异常处理策略有点困惑 我们不想向外界透露太多 BLL 的信息 从其他层到bll就可以了 我们不想让 t
  • 如何在线程创建和退出时调用函数?

    include
  • 使用 JSON 格式正确配置 NLog 到 IHostBuilder

    我有以下代码 应该接受 NLog 的 JSON appsettings 配置 然后使用它来创建 NLog LogFactory 这个 NLog 工厂应该被传递到 MyService 类中 以便在那里创建一个记录器 class Program
  • 在 DataGridView 中隐藏行非常慢

    我在 Winforms 应用程序中有一个 DataGridView 大约有 1000 行 未绑定 和 50 列 隐藏一列需要整整 2 秒 当我想隐藏大约一半的行时 这就成为一个问题 private void ShowRows string
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • 在 C# 中调用事件处理程序

    我一直在尝试学习如何在 C 中使用事件处理程序 但我无法弄清楚 handler this e 在以下代码中的作用 public event EventHandler ThresholdReached protected virtual vo
  • 如何使用boost库读取和写入.ini文件[重复]

    这个问题在这里已经有答案了 如何使用boost库读取和写入 或修改 ini文件 With Boost PropertyTree您可以读取并更新树 然后写入文件 请参阅load and save功能 看一下如何访问属性树中的数据 http w
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • 使用 INotifyPropertyChanged

    有人可以解释一下为什么在 wpf 中使用绑定时需要使用 INotifyPropertyChanged 的 实现吗 我可以在不实现此接口的情况下绑定属性吗 例如我有代码 public class StudentData INotifyProp
  • 为什么字体扩展仅适用于 PDF,而不适用于其他格式(HTML、XLS、DOC)?

    通过 Jaspersoft Studio 我们使用以下设置将用于 Web 应用程序的内置 Windows Calibri 字体变体导出到字体扩展 JAR 中 导出的jrfontextensions jar内的目录结构如下 jrfontext
  • 使用宏计算源文件行数?

    是否可以使用 C C 预处理器将源文件中的行数计算为宏或某种编译时可用值 例如 我可以更换吗MAGIC1 MAGIC2 and MAGIC3在下面 并在使用时以某种方式获取值 4MAGIC3 MAGIC1 can be placed whe
  • ASP.NET MVC 中 ModelState.AddModelError 中的关键参数有什么意义?

    我在我的控制器中添加了验证检查来修改ModelState如果验证失败 例如 private bool ValidateMoney string raw string name decimal min decimal max try var
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • 如何使用 xamarin 表单提示用户进行地理定位

    我正在 Xamarin Forms 应用程序中开发一个应用程序 需要请求地理位置权限 如果获得许可 它需要从设备获取地理位置数据 然后将地理位置坐标放入 Forecast io URL 我正在使用 James 的 Geolocator 插件
  • 字符串 c 的二叉树

    我正在尝试实现一个能够在 c 中保存字符串的二叉树 在让代码适用于整数之后 我尝试稍微修改它以处理字符数组 现在我似乎完全破解了代码 但不知道如何破解 任何帮助表示赞赏 include
  • 修改代码以从 Windows 中的 PE 可执行文件检索双重签名信息?

    我已经挣扎了一段时间想要修改这段代码示例 https support microsoft com en us help 323809 how to get information from authenticode signed execu
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 在 C# WinForms 中预览文档(Word、Excel、PDF、文本文件等)?

    我正在开发一个 C WinForms 应用程序 我希望能够 预览 其中的各种文档类型 也就是说 当用户从列表中选择文件名时 它会在下面以相同的形式显示所选文件的预览 这很像 Outlook 允许您无需双击即可预览选定邮件的方式 有没有什么方
  • 扔掉挥发物安全吗?

    大多数时候 我都是这样做的 class a public a i 100 OK delete int j Compiler happy But is it safe The following code will lead compilat
  • 自定义字体显示在 IB 中,但不显示在模拟器中

    我已经设置了一个UITextView and a UILabel使用自定义字体 它是垂直镜像的蒙古文字体 但我还添加了英文文本 以便您可以看到效果 这些文字显示在 Interface Builder 中 但在模拟器中大部分字符都在UITex

随机推荐

  • 在 Swift 中处理 XML 元素的属性

    我想阅读url使用 NSXMLParser 来自此元素的属性
  • 如何从 Android 应用程序读取内存数据

    我想从应用程序中获取一些数字数据 但它们不会存储为像 db 这样的文件 我知道有一些内存黑客应用程序可以改变游戏值 尽管我不知道它们是如何工作的 我正在寻找类似的功能 但不需要更改任何内容 我试图编写的应用程序只是从特定应用程序读取一些数据
  • 在 PHP 中使用 array_chunk 移动元素

    我有一个基本数组 其中使用 array chunk 将其分为 3 个元素 array array a b c d e f g h chunk array chunk array 3 结果如下 a b c d e f g h Las chun
  • 如果未实例化成员模板,是否要评估 static_asserts?

    我想我明白了static assert工作了 但是当我在 g 编译器上尝试这个时 我开始想知道 include
  • 错误:关系不存在

    所以问题就在这里 我正在用 java 抓取一些数据 最终我将 java 放入 postgres 数据库中 当我运行 Java 程序时 我收到错误 ERROR 关系 表名 不存在 但是当我亲自在 PGAdmin III 中编写相同的查询时 它
  • 使用 svd 求解欠定 scipy.sparse 矩阵

    Problem 我有一组方程 其中变量用小写变量表示 常量用大写变量表示 A a b B c d C a b c d e 我在具有两列的 pandas DataFrame 中提供了有关这些方程结构的信息 常数 and 变量 E g df p
  • 如何根据 R ggplot2 中的 y 轴值重新排序 x 轴

    我正在尝试根据 y 轴的平均值对错误图上的 x 轴重新排序 我不介意是升序还是降序 我已经应用了基于的解决方案这个帖子 但是由于某种原因 它似乎忽略了reorder命令 你知道这里发生了什么吗 Import data df lt struc
  • Oracle UNION 不同列

    我有两张桌子 看起来像 TABLE 1 COL A int COL B float COL C float TABLE 2 COL A int COL B float 我的查询使用 UNION 将这些表的结果放在一起 但在 TABLE 2
  • 为什么我的 Perl 程序无法在 Windows 上创建超过 4 GB 的文件?

    为什么输出到文件时文件大小上限为 4 GB 使用打印文件 我希望通过流输出 应该可以生成任意大小的文件 Update ijw and 查斯 欧文斯是正确的 我以为F 驱动器是NTFS格式的 但实际上它使用的是FAT32文件系统 我 在另一个
  • 构建相关变量

    我有一个具有给定分布的变量 在下面的示例中为正态分布 set seed 32 var1 rnorm 100 mean 0 sd 1 我想创建一个与 var1 相关的变量 var2 其线性相关系数 大致或精确 等于 Corr var1 和 v
  • 如何在 Inno Setup 中根据操作系统版本选择要复制的文件?

    我已经使用 Inno setup 构建了一个安装程序 最近发现有些应用程序在Windows XP下无法运行 这些应用程序在 Windows 7 及更高版本上运行良好 我需要根据用户安装的 Windows 版本复制文件并相应地创建程序菜单快捷
  • 使用react-native检查手机上是否安装了Metamask应用程序

    我正在使用构建一个应用程序react native 我正在使用 React Native 的Linking用于在手机上安装的 Metamask 应用程序中打开我的网站链接的 API 这Linking opneURl url 如果设备上安装了
  • Node.js 无法连接到 MongoDB

    我对 Node js 和 MongoDB 都很陌生 我正在遵循本指南 http howtonode org express mongodb使用 Node js 和 MongoDB 创建一个简单的博客 当节点尝试连接到 MongoDB 时 它
  • SQL 中 XML 分解的替代方案

    我尝试使用 XQuery 将 XML 分解到临时表中 nodes如下 但是 我遇到了性能问题 粉碎需要花费很多时间 请给我一个关于替代方案的想法 我的要求是将批量记录传递给存储过程并解析这些记录并根据记录值执行一些操作 CREATE TAB
  • Protractor:使用 browser 或 browser.driver 方法?

    使用时protractor 全局变量browser似乎具有以下所有功能browser driver 我特意问这个是因为我不确定是否使用browser wait or browser driver wait因为它们看起来都是相同的方法 而且我
  • Json 问号(“??????”)而不是希伯来字符

    我正在从我的数据库获取包含希伯来语单词的数据 然后我从以下位置获取这些数据ResultSet放入一个字符串 然后放入一个JSONObject 这是代码 response setContentType application json Str
  • 了解 awk 分隔符 - 在基于正则表达式的字段分隔符中转义

    我有以下 shell 命令 awk F print 2 这个命令是做什么的 使用分隔符分割成字段 sometext E g echo this line passed to awk awk F print 2 line Editor s n
  • 使用 R 和 Lattice 的 XYZ 图中高程数据的颜色渐变

    我有一堆 XYZ 数据 其中 X 和 Y 是坐标 Z 应该是高程 LiDAR 点 我正在尝试使用基于 Z 值的梯度来绘制该点云 这是我到目前为止所拥有的 Read the CSV file with the LiDAR point clou
  • 序列化字节数组与 XML 文件

    我大量使用字节数组通过网络来回传输对象 原始数据 我采用了 java 的方法 通过让类型实现 ISerialized 它包含两个方法 作为接口的一部分 ReadObjectData 和 WriteObjectData 任何使用此接口的类都会
  • 计算字符串宽度(以像素为单位)以模拟自动换行时出现奇怪的行为

    尝试获取 C 中的字符串宽度来模拟自动换行和文本位置 现在用 richTextBox 编写 richTextBox 的大小是 555x454 px 我使用等宽字体 Courier New 12pt I tried TextRenderer