使用可变宽度字体创建文本列

我正在尝试为将在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类。 最简单的情况:

 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字体看起来并没有完全相同(并且测量)。

您可以尝试使用Graphics类来测量给定特定字体的字符串的长度,然后使用它来确定要使用的选项卡的数量。

看起来您正试图在单个文本字段中以ASCII格式呈现这一切。 是? 如果是这样的话,这非常棘手。 看起来你现在每个标签后都有固定数量的标签,这就是问题所在。 你可以改为做空格 – 我怀疑你是用padright做的(不太熟悉那个特定的function)。

但关键是,使用纯ASCII这样的ASCII,以可变宽度字体显示,你永远不会让它在第二列中完美排列。 如果你勤奋,你可以把它关闭,但就是这样 – 如果你有一排有大量的资本W,而另一行有很多小写的,那么无论你做什么,你都会有很大的宽度差异。 如果您使用GDI进行渲染,最好的方法是每列调用一次DrawText。 如果需要,可以从每列中生成一个大字符串,并在第一列上调用MeasureString以确定需要为第二列移动多少空间。

或者,如果这是一个可以执行html的界面,那么表或div可以很好地工作。 取决于您的环境的具体情况。 如果这是WinForms等,你还可以做一些像在FlowLayout面板中有两个自动高度设置标签的东西。有很多选项可以使这个工作,但只是不是纯可变宽度字体的ascii。

编辑:另外,我看到你问过如何在Web服务中获取Graphics类实例。 你可以这样做:

  private static Bitmap bitmap = new Bitmap( 1, 1 ); private static Graphics graphics = null; public static Graphics GetGeneralGraphics() { if ( graphics == null ) graphics = Graphics.FromImage( bitmap ); return graphics; } 

您可能希望在Web服务上下文中创建这些局部变量(在完成时正确处置)。

你应该用HTML格式化所有内容,然后你可以输出列的TABLE和TR / TD元素