吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 842|回复: 39
收起左侧

[学习记录] C# 无法正确计算string的显示宽度,无论用MeasureString或GraphicsPath,全是bug

[复制链接]
ilovecomputer66 发表于 2022-7-28 14:40
看了国内外各种资料、文档,测试了多种代码后,终于得到结论,虽然也不敢相信,但事实如此

测试代码如下:
都是给一个textbox注册textChange事件,在手工输入后,实时计算字符串的显示宽度,然后改变上面的一个textbox的size,从而直观显示

方法1:
[C#] 纯文本查看 复制代码
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;
        }


结果如下:一开始输入时,还能大差不差一致的。越输入越多,然后差的越来越远
1.png
方法2:
[C#] 纯文本查看 复制代码
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;
        }


也是一开始输入时,还能大差不差一致的。越输入越多,然后差的越来越远


2.png

——————————————————————————————————————————————————
其中第一种方法是算出来的比实际大,第二种是算出来比实际小
但总之都是bug

C# 就没有能正确计算显示width的方法,绝望。。。。。无语

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| ilovecomputer66 发表于 2022-7-28 14:43
补充:国内如果搜,基本都是这2种方法写的文章,而且都是完全一样的一篇转载来转载去,评论区全都是反馈文章根本不对的。

写篇算是踩坑笔记了。
Light紫星 发表于 2022-7-28 15:25
是richtextbox的问题,你如果建立2个textbox,是一样的,richtextbox显示的字体样式和textbox好像不太一样
momosys 发表于 2022-7-28 15:28
算一个文字的宽度,然后总宽度=单独文字宽度*文字总数呢
JavaUser404 发表于 2022-7-28 15:46
sf.FormatFlags |= StringFormatFlags.MeasureTrailingSpaces;
这个或运算得到MeasureTrailingSpaces这个元素的值,是吧,那我想问你你下面这行却要获取MeasureString这个元素的值?
float width = graphics.MeasureString(text, richTextBox1.Font, PointF.Empty, sf).Width;
 楼主| ilovecomputer66 发表于 2022-7-28 15:51
本帖最后由 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:55
本帖最后由 ilovecomputer66 于 2022-7-28 15:59 编辑
Light紫星 发表于 2022-7-28 15:25
是richtextbox的问题,你如果建立2个textbox,是一样的,richtextbox显示的字体样式和textbox好像不太一样

TEXTBOX  的效果比richtextbox误差稍微好一些,但都能明显看出来算的不对。而且都是字符串越长(不换行情况下),误差越来越大
JavaUser404 发表于 2022-7-28 15:59
你是想要获取textBox2.Width对吧,但是你前面并没有定义这个参数呀,前面都是在说textBox1,并没有textBox2这个参数,所以你获取的参数值就不对了
 楼主| ilovecomputer66 发表于 2022-7-28 16:00
momosys 发表于 2022-7-28 15:28
算一个文字的宽度,然后总宽度=单独文字宽度*文字总数呢

额。。兄弟这样就有点空想了

iiiiiiiiii
MMMMMMMMM

同样是10个字符,宽度差别这么大,怎么可能简单乘法
 楼主| ilovecomputer66 发表于 2022-7-28 16:03
JavaUser404 发表于 2022-7-28 15:59
你是想要获取textBox2.Width对吧,但是你前面并没有定义这个参数呀,前面都是在说textBox1,并没有textBox2 ...

不是获取textBox2.Width
我是获取文本的宽度,不是文本框的宽度

兄弟能给一下你的代码么
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-9 08:02

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表