gpt4 book ai didi

c# - 如何精确测量字符串的宽度?

转载 作者:太空狗 更新时间:2023-10-29 21:02:21 27 4
gpt4 key购买 nike

首先,问题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 组合最接近我的需要(它在大多数情况下都有效,特殊字符除外),但是使用像 # break it 这样的字符。宽度要么更短,要么更长。

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

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

最佳答案

你只需要消除额外的宽度。您可以使用 string format 来完成此操作:

GdipStringFormatGetGenericTypographic()

您还可以使用:

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

这将使您能够使用其他语言,例如日语

On codeproject , 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);
}

关于c# - 如何精确测量字符串的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com