Frage

Ich versuche coloumns von Text für eine C # -Anwendung zu erstellen, die auf MSN Messenger ausgeführt werden sollen. Ich habe trouple alles Aufstehen auszukleiden.

Hier ist ein Beispiel für die Ausgabe, die ich will:

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.

Aber weil es eine variable Breite Schriftart es wie folgt angezeigt wird:

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.

Ich habe versucht, das C # string.PadRight () -Funktion sowie meine eigene Funktion erstellen, die Polsterung mit Leerzeichen und Tabulatoren hinzufügen. Beide arbeiten gut mit festen Breite-Schriften, sondern brechen mit variabler Breite Schriftart.

Gibt es eine Möglichkeit, die Breite einer Zeichenkette in einer bestimmten Schriftart?

, um zu bestimmen

Oder hat jemand noch andere Vorschläge?

War es hilfreich?

Lösung

Verwenden Sie einfach die TextRenderer- Klasse . Der einfachste Fall:

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

Wenn Sie keinen Zugriff auf System.Windows.Fonts Graphics. bleibt MeasureString es einige Einschränkungen, aber sollte die Arbeit machen:

Bitmap bmp = new Bitmap(1,1);
Graphics graphics = Graphics.FromImage(bmp);
SizeF size = graphics.MeasureString("Hello world", someFont);

Aber beachten Sie, dass, wenn die Schriftart des Textes und die Räume müssen gleich sein wird es Fälle geben, wo Sie den Text nicht perfekt ausrichten. Ich weiß nicht, was MSN Messenger der Lage ist, in Ihrem Fall zu tun, aber es sei denn, Sie Zugriff auf zumindest eine Teilmenge von HTML haben, werden Sie nicht einen perfekten Ausgang haben.

Sie sollten sich auch bewusst sein, dass, wenn Sie Messungen auf einem lokalen Computer zu tun und ohne die richtige Schriftart zu einem anderen senden Sie Ihre Spalten installiert werden nicht mehr wie Spalten sehen so Ihre auf die Untergruppe von Schriftarten präsentiert auf allen Computern beschränkt sind.

Wenn mehrere Betriebssystem-Unterstützung ist auch eine Anforderung, die Sie einige großen Probleme wie die Schriftart Arial auf Mac haben und PC sieht nicht so aus (und Maß) genau das gleiche.

Andere Tipps

Sie könnten versuchen, die Graphics-Klasse eine bestimmte Schriftart, die Länge der Saite gegeben zu messen, dann verwenden, um zu bestimmen, wie viele Tabs zu verwenden.

Es sieht aus wie Sie dies versuchen, alle in einem einzigen Textfeld in ASCII zu machen. Ja? Wenn das der Fall ist, dann ist das ziemlich schwierig. Es sieht aus wie Sie eine feste Anzahl von Tabs nach jedem jetzt haben, und das würde das Problem sein. Sie könnten stattdessen Räume tun -. Was ich vermute, dass Sie mit PadRight tun (nicht sehr vertraut mit dieser spezifischen Funktion)

Das Wichtigste ist jedoch, dass mit reinem ASCII wie das, in variabler Breite Schriftart dargestellt, werden Sie es nie perfekt in einer zweiten Spalte aufreihen erhalten. Sie können es in der Nähe, wenn man fleißig sind, aber das ist es - wenn Sie eine Zeile mit viel Kapital Ws haben, und eine andere mit viel Klein i ist, werden Sie ganz gleich große Breite Unterschiede haben, was Sie tun. Wenn Sie in GDI rendern, ist der beste Ansatz einen Anruf zu tätigen pro Spalte drawText. Sie können aus jeder Spalte eine große Zeichenfolge, wenn Sie wollen, und rufen Sie MeasureString auf der ersten Spalte, um zu bestimmen, wie viel Platz Sie für die zweite Spalte bewegen über müssen.

Oder wenn es sich um eine Schnittstelle, wo Sie html tun können, Tabellen oder divs groß funktionieren würde. Hängt von den Besonderheiten Ihrer Umgebung. Man könnte auch so etwas wie mit zwei Auto-Höhe-Set Etikett in einem Flowlayout-Panel zu tun, wenn dieser WinForms war, etc. Es gibt diese Arbeit eine Menge von Optionen für die Herstellung, aber einfach nicht rein ascii mit variabler Breite Schriftart.

EDIT: Auch ich sehe dich gefragt, wie eine Grafikklasseninstanz in einem Web-Service zu erhalten. Sie können etwas tun:

    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;
    }

Sie wollen wahrscheinlich diese lokalen Variablen machen (die Sie entsorgen, wenn sie mit fertig) in einem Web-Services-Kontext.

Sie sollten wahrscheinlich alles im HTML-Format, dann könnten Sie einfach Ausgang TABLE und TR / TD-Elemente für die Spalten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top