質問

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 グラフィックスにアクセスできない場合。 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で実行していると思われます(その特定の機能にあまり詳しくありません)。

しかし、重要なことは、可変幅フォントで表示されるそのような純粋なASCIIでは、2列目に完全に並ぶことは決してないということです。あなたが勤勉であればそれを近づけることができますが、それはそれです-大文字のWがたくさんある行と小文字のiがたくさんある別の行があると、あなたが何をしても大きな幅の違いがあります。 GDIでレンダリングする場合、最良のアプローチは、列ごとに1つのDrawTextを呼び出すことです。必要に応じて、各列から1つの大きな文字列を作成し、最初の列でMeasureStringを呼び出して、2番目の列に移動する必要があるスペースの量を判断できます。

または、これがhtmlを実行できるインターフェイスである場合、テーブルまたはdivがうまく機能します。環境の詳細に依存します。また、これがWinFormsである場合、FlowLayoutパネルに2つの自動高さセットラベルを付けるなどの操作を行うこともできます。この作業を行うための多くのオプションがありますが、可変幅フォントを持つ純粋な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