C# 无法正确计算string的显示宽度,无论用MeasureString或GraphicsPath,全是bug
看了国内外各种资料、文档,测试了多种代码后,终于得到结论,虽然也不敢相信,但事实如此测试代码如下:
都是给一个textbox注册textChange事件,在手工输入后,实时计算字符串的显示宽度,然后改变上面的一个textbox的size,从而直观显示
方法1:
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
string text = richTextBox1.Text;
Graphics graphics = richTextBox1.CreateGraphics();
StringFormat sf = StringFormat.GenericTypographic;
sf.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
float width = graphics.MeasureString(text, richTextBox1.Font, PointF.Empty, sf).Width;
textBox2.Width = (int)width;
}
结果如下:一开始输入时,还能大差不差一致的。越输入越多,然后差的越来越远
方法2:
private void richTextBox1_TextChanged(object sender, EventArgs e)
{
string text = richTextBox1.Text;
GraphicsPath path = new GraphicsPath();
path.AddString(text, richTextBox1.Font.FontFamily, (int)richTextBox1.Font.Style, richTextBox1.Font.Size, new Point(0, 0), StringFormat.GenericTypographic);
RectangleF rectangeF = path.GetBounds();
textBox2.Width = (int)rectangeF.Width;
}
也是一开始输入时,还能大差不差一致的。越输入越多,然后差的越来越远
——————————————————————————————————————————————————
其中第一种方法是算出来的比实际大,第二种是算出来比实际小
但总之都是bug
C# 就没有能正确计算显示width的方法,绝望。。。。。无语 补充:国内如果搜,基本都是这2种方法写的文章,而且都是完全一样的一篇转载来转载去,评论区全都是反馈文章根本不对的。
写篇算是踩坑笔记了。 是richtextbox的问题,你如果建立2个textbox,是一样的,richtextbox显示的字体样式和textbox好像不太一样 {:1_904:}算一个文字的宽度,然后总宽度=单独文字宽度*文字总数呢 sf.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
这个或运算得到MeasureTrailingSpaces这个元素的值,是吧,那我想问你你下面这行却要获取MeasureString这个元素的值?
float width = graphics.MeasureString(text, richTextBox1.Font, PointF.Empty, sf).Width; 本帖最后由 ilovecomputer66 于 2022-7-28 15:56 编辑
JavaUser404 发表于 2022-7-28 15:46
sf.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
这个或运算得到MeasureTrailingSpaces这个 ...
没有看明白朋友想表达的意思。
是说上面代码写错了么?
如果是的话,麻烦说清楚一下,我换上去试试
一开始我用stringFormat.default 不行,网上有人说用sf.FormatFlags |= StringFormatFlags.MeasureTrailingSpace
换上去还是不行 本帖最后由 ilovecomputer66 于 2022-7-28 15:59 编辑
Light紫星 发表于 2022-7-28 15:25
是richtextbox的问题,你如果建立2个textbox,是一样的,richtextbox显示的字体样式和textbox好像不太一样
TEXTBOX的效果比richtextbox误差稍微好一些,但都能明显看出来算的不对。而且都是字符串越长(不换行情况下),误差越来越大 你是想要获取textBox2.Width对吧,但是你前面并没有定义这个参数呀,前面都是在说textBox1,并没有textBox2这个参数,所以你获取的参数值就不对了 momosys 发表于 2022-7-28 15:28
算一个文字的宽度,然后总宽度=单独文字宽度*文字总数呢
额。。兄弟这样就有点空想了
iiiiiiiiii
MMMMMMMMM
同样是10个字符,宽度差别这么大,怎么可能简单乘法 JavaUser404 发表于 2022-7-28 15:59
你是想要获取textBox2.Width对吧,但是你前面并没有定义这个参数呀,前面都是在说textBox1,并没有textBox2 ...
不是获取textBox2.Width
我是获取文本的宽度,不是文本框的宽度
兄弟能给一下你的代码么