6

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

4 に答える 4

7

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 フォントがまったく同じに見えない (および測定されない) ため、いくつかの大きな問題が発生します。

于 2009-03-02T22:29:30.540 に答える
0

Graphics クラスを使用して特定のフォントの文字列の長さを測定し、それを使用して使用するタブの数を決定できます。

于 2009-03-02T22:27:45.723 に答える
0

これをすべてASCIIで単一のテキストフィールドにレンダリングしようとしているようです。はい?だとしたら、かなり厄介です。現在、各タブの後に固定数のタブがあるように見えますが、それが問題になります。代わりにスペースを使用することもできます-これは padright で行っていると思われます(その特定の機能にあまり慣れていません)。

ただし、重要なことは、そのような純粋な ASCII を可変幅フォントで表示すると、2 番目の列に完全に並べることは決してできないということです。勤勉であれば近づけることができますが、それだけです。大文字の W が多い行と小文字の i が多い行がある場合、何をしても幅が大きく異なります。GDI でレンダリングしている場合、最適な方法は、列ごとに DrawText を 1 回呼び出すことです。必要に応じて、各列から 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 サービス コンテキストで作成する必要があります。

于 2009-03-03T07:17:21.177 に答える
-1

おそらくすべてを HTML でフォーマットする必要があります。その後、列の TABLE 要素と TR/TD 要素を出力するだけで済みます。

于 2009-03-02T22:28:33.540 に答える