Question

J'essaie de créer des colonnes de texte pour une application C # qui s'exécutera sur MSN Messenger. Je suis en train de faire en sorte que tout soit en ordre.

Voici un exemple de sortie que je veux:

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.

Mais comme il s’agit d’une police à largeur variable, il s’affiche comme suit:

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.

J'ai essayé d'utiliser la fonction C # string.PadRight () et de créer ma propre fonction qui ajoute un remplissage à l'aide d'espaces et de tabulations. Les deux fonctionnent bien avec les polices de largeur fixe mais se cassent avec les polices de largeur variable.

Existe-t-il un moyen de déterminer la largeur d'une chaîne dans une police donnée?

Ou quelqu'un a-t-il d'autres suggestions?

Était-ce utile?

La solution

Utilisez simplement la TextRenderer . . Le cas le plus simple:

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

Si vous n'avez pas accès à System.Windows.Fonts, Graphics. MeasureString reste, il a quelques limitations mais devrait faire le travail:

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

Mais sachez que si la police de votre texte et les espaces DOIVENT être identiques, il y aura des cas où vous ne pourrez pas aligner le texte à la perfection. Je ne sais pas ce que MSN Messenger est capable de faire dans votre cas, mais sauf si vous avez accès à au moins un sous-ensemble de HTML, vous n'aurez pas une sortie parfaite.

Vous devez également savoir que si vous effectuez des mesures sur un ordinateur local et que vous les envoyez à un autre sans la police correcte, vos colonnes ne ressembleront plus à des colonnes, de sorte que vous êtes limité au sous-ensemble de polices de base présent sur tous les ordinateurs.

Si plusieurs systèmes d'exploitation sont également nécessaires, vous aurez de gros problèmes, car la police Arial sur Mac et PC n'a pas exactement la même apparence (et ne la mesure pas).

Autres conseils

Vous pouvez utiliser la classe Graphics pour mesurer la longueur de la chaîne en fonction d'une police spécifique, puis l'utiliser pour déterminer le nombre d'onglets à utiliser.

On dirait que vous essayez de rendre tout cela en ASCII dans un seul champ de texte. Oui? Si c'est le cas, c'est assez délicat. Il semble que vous ayez un nombre fixe d'onglets après chacun en ce moment, et ce serait le problème. Vous pourriez plutôt créer des espaces - ce que je suppose que vous utilisez avec padright (vous ne connaissez pas très bien cette fonction).

Cependant, l’essentiel, c’est que, si l’ASCII pur est présenté dans une police à largeur variable, il ne sera jamais parfaitement aligné dans une deuxième colonne. Vous pouvez vous en approcher si vous êtes assidu, mais c'est tout. Si vous avez une ligne avec beaucoup de W majuscules et une autre avec beaucoup de minuscules, vous aurez de grandes différences de largeur, peu importe ce que vous faites. Si vous effectuez un rendu dans GDI, la meilleure approche consiste à effectuer un appel à DrawText par colonne. Vous pouvez créer une grosse chaîne à partir de chaque colonne si vous le souhaitez et appeler MeasureString sur la première colonne pour déterminer la quantité d'espace à déplacer pour la deuxième colonne.

Ou s’il s’agit d’une interface où vous pouvez créer du HTML, des tables ou des divs fonctionneraient très bien. Dépend des spécificités de votre environnement. Vous pouvez également faire quelque chose comme avoir deux étiquettes à hauteur automatique dans un panneau FlowLayout s'il s'agit de WinForms, etc. Il existe de nombreuses options pour ce faire, mais ce n'est tout simplement pas du pur ascii avec une police à largeur variable.

EDIT: De plus, je vous ai vu demander comment obtenir une instance de classe Graphics dans un service Web. Vous pouvez faire quelque chose comme ceci:

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

Vous souhaitez probablement créer ces variables locales (que vous avez correctement éliminées lorsque vous avez terminé) dans un contexte de services Web.

Vous devriez probablement tout formater en HTML, alors vous pourriez simplement sortir des éléments TABLE et TR / TD pour les colonnes

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top