7

まず第一に、回答How to measure width of character precisely?された質問は、このケースでは実際には役に立たないため、これはその複製ではありません

私はひもを持っています。を使用して描画しgraphics.DrawStringますが、その後に別の文字列を配置する必要がある場合は、前の文字列の正確な幅を知る必要があります。

このために、graphics.MeasureString を次のように使用します。

StringFormat format = new StringFormat(StringFormat.GenericTypographic);
format.Alignment = StringAlignment.Center;
format.Trimming = StringTrimming.None;
format.FormatFlags = StringFormatFlags.MeasureTrailingSpaces;

私は他の多くの関数を試しTextRendered.MeasureTextましたが、パラメータの可能なすべての組み合わせですべて失敗しました。

上記の MeasureString の組み合わせは、必要なものに最も近いものです (特殊文字を除いてほとんどの場合に機能します) が、 # のような文字を使用すると壊れます。幅は短くても長くてもかまいません。

DrawString 関数によって生成されたテキストの正確なサイズを取得する方法はありますか? DrawString は描画領域のサイズをどのように計算しますか? サイズが常に異なるため、明らかに他の関数である必要があります。

アプリケーション全体のソース コードはこちらhttps://gitorious.org/pidgeon/pidgeon-main/ (これを使用するファイルはhttps://gitorious.org/pidgeon/pidgeon-main/blobs/master/scrollbackです) /SBABox.cs )

4

4 に答える 4

9

余分な幅をなくすだけです。文字列フォーマットを使用してこれを行うことができます:

GdipStringFormatGetGenericTypographic()

以下を使用することもできます。

float doubleWidth = g.MeasureString(text+text,...).Width;
float singleWidth = g.MeasureString(text).Width;
float textWidth = doubleWidth-singleWidth;

これにより、日本語などの他の言語で作業することができます

codeprojectで、Pierre Anaud の解決策は を使用することでしたMeasureCharacterRanges。これは、指定された文字列の境界ボックスと正確に一致する領域を返します。

static public int MeasureDisplayStringWidth(Graphics graphics, string text, Font font)
{
    System.Drawing.StringFormat format  = new System.Drawing.StringFormat ();
    System.Drawing.RectangleF   rect    = new System.Drawing.RectangleF(0, 0, 1000, 1000);
    var ranges  = new System.Drawing.CharacterRange(0, text.Length);
    System.Drawing.Region[] regions = new System.Drawing.Region[1];

    format.SetMeasurableCharacterRanges (ranges);

    regions = graphics.MeasureCharacterRanges (text, font, rect, format);
    rect    = regions[0].GetBounds (graphics);

    return (int)(rect.Right + 1.0f);
}
于 2012-07-29T11:41:09.973 に答える
1

この方法を使用してみてください:

GDI+ (graphics.MeasureString and graphics.DrawString) >> System.Drawing.Graphics
GDI (TextRenderer.MeasureText and TextRenderer.DrawText)

また、次のことにも役立ちます。

カスタム メジャー メソッドを記述します。

  • エントリ文字列を特殊文字で分割
  • 上記の .net メソッドを使用する
  • 特殊文字の幅を計算して合計...

イアン・ボイドの回答を読む

于 2012-07-29T11:45:32.330 に答える