我正在尝试为将在 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() 函数以及创建自己的函数,使用空格和制表符添加填充。两者都适用于固定宽度字体,但适用于可变宽度字体。

有什么方法可以确定给定字体中字符串的宽度吗?

或者有人有其他建议吗?

有帮助吗?

解决方案

只需使用 文本渲染器 班级。最简单的情况:

Size size = TextRenderer.MeasureText("Hello world", someFont);

如果您无权访问 System.Windows.Fonts 图形.测量字符串 仍然存在,它有一些限制,但应该完成以下工作:

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 做(不太熟悉该特定功能)。

但关键是,使用像这样的纯 ASCII(以可变宽度字体显示),您永远无法让它在第二列中完美对齐。如果你勤奋的话,你可以得到它,但就是这样——如果你的一行有很多大写的W,而另一行有很多小写的i,那么无论你做什么,你都会有很大的宽度差异。如果您在 GDI 中渲染,最好的方法是每列调用一次 DrawText。如果需要,您可以在每一列中生成一个大字符串,然后在第一列上调用 MeasureString 来确定第二列需要移动多少空间。

或者,如果这是一个可以处理 html、表格或 div 的界面,那就太好了。取决于您的环境的具体情况。您还可以执行一些操作,例如在 FlowLayout 面板中添加两个自动高度设置标签(如果这是 WinForms 等)。有很多选项可以实现此功能,但不仅仅是具有可变宽度字体的纯 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 元素

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top