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

时间:2009-03-02 22:24:32

标签: c# text-formatting windows-live-messenger

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

有没有办法确定给定字体中字符串的宽度?

或者有人有任何其他建议吗?

4 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

但关键是,使用纯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服务上下文中创建这些局部变量(在完成时正确处理)。

答案 3 :(得分:-1)

您可能应该格式化HTML中的所有内容,然后您可以只为列输出TABLE和TR / TD元素