作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试为将在 MSN Messenger 上运行的 C# 应用程序创建文本列。我很难把所有东西都排好。
这是我想要的输出示例:
1) Pizza Hut 123 Fake St.
2) Domino's Pizza 123 Fake St.
3) The Cheesecake Cafe 123 Fake St.
4) Capital Pizza & Steakhouse 123 Fake St.
5) Funky Pickle Pizza 123 Fake St.
6) Boston Pizza 123 Fake St.
7) Rose Bowl Rouge Lounge 123 Fake St.
8) Royal Pizza 123 Fake St.
9) A Columbus Pizza & Donair Inc 123 Fake St.
但是因为它是可变宽度字体,所以显示如下:
1) Pizza Hut 123 Fake St.
2) Domino's Pizza 123 Fake St.
3) The Cheesecake Cafe 123 Fake St.
4) Capital Pizza & Steakhouse 123 Fake St.
5) Funky Pickle Pizza 123 Fake St.
6) Boston Pizza 123 Fake St.
7) Rose Bowl Rouge Lounge 123 Fake St.
8) Royal Pizza 123 Fake St.
9) A Columbus Pizza & Donair Inc 123 Fake St.
我已经尝试使用 C# string.PadRight() 函数以及创建我自己的函数来使用空格和制表符添加填充。两者都适用于固定宽度的字体,但不适用于可变宽度的字体。
有没有办法确定给定字体中字符串的宽度?
或者大家有什么其他的建议吗?
最佳答案
只需使用 TextRenderer类(class)。最简单的情况:
Size size = TextRenderer.MeasureText("Hello world", someFont);
如果您无权访问 System.Windows.Fonts Graphics.MeasureString仍然存在,它有一些限制,但应该可以完成工作:
Bitmap bmp = new Bitmap(1,1);
Graphics graphics = Graphics.FromImage(bmp);
SizeF size = graphics.MeasureString("Hello world", someFont);
但请注意,如果您的文本字体和空格必须相同,那么在某些情况下您将无法完美对齐文本。我不知道 MSN Messenger 在你的情况下能做什么,但除非你至少可以访问 HTML 的一个子集,否则你不会有完美的输出。
您还应该知道,如果您在本地计算机上进行测量并在没有安装正确字体的情况下发送到另一台计算机,您的列将不再像列,因此您只能使用所有计算机上显示的基本字体子集。
如果多操作系统支持也是一项要求,您将遇到一些大问题,因为 Mac 和 PC 上的 Arial 字体看起来(和尺寸)并不完全相同。
关于c# - 使用可变宽度字体创建文本列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/604298/
我是一名优秀的程序员,十分优秀!