1

C++ で GDI+ を使用して、キャンバスに文字列を描画します。特定のフォントの文字列のアウトレイヤー (幅、高さ) を取得する API はありますか? どうもありがとう!Windows プログラマーのソリューションに感謝します。次のコードを書きました。

    Bitmap bitmap(1000,1000);
    Graphics graphics(&bitmap);
    RectF rec;
    RectF useless;
    graphics.MeasureString(m_sWords, -1, m_pFont.get(), useless, &rec);
    int WordWidth = rec.Width + 1;
    int WordHeight Height = rec.Height + 1;

実際のグラフィックスを使用して MeasureString を呼び出す必要がありますか? 大きなグラフィック インスタンスを作成せずに、ワード幅、ワード高さを取得する方法はありますか? リソースを消費していることがわかりました。

4

3 に答える 3

2

Graphics::MeasureString は近似値を計算します。

于 2009-04-14T04:04:07.327 に答える
1

Graphics残念ながら、これを行うにはオブジェクトを使用する必要があります。

私が使用する C# コード (RectangleF幅と高さの両方を知りたいため、 a を返します) は次のとおりです。

/// <summary> The text bounding box. </summary>
private static readonly RectangleF __boundingBox = new RectangleF(29, 25, 90, 40);

/// <summary>
///    Gets the width of a given string, in the given font, with the given
///    <see cref="StringFormat"/> options.
/// </summary>
/// <param name="text">The string to measure.</param>
/// <param name="font">The <see cref="Font"/> to use.</param>
/// <param name="fmt">The <see cref="StringFormat"/> to use.</param>
/// <returns> The floating-point width, in pixels. </returns>
private static RectangleF GetStringBounds(string text, Font font,
   StringFormat fmt)
{
   CharacterRange[] range = { new CharacterRange(0, text.Length) };
   StringFormat myFormat = fmt.Clone() as StringFormat;
   myFormat.SetMeasurableCharacterRanges(range);

   using (Graphics g = Graphics.FromImage(
       new Bitmap((int) __boundingBox.Width, (int) __boundingBox.Height)))
   {
      Region[] regions = g.MeasureCharacterRanges(text, font,
         __boundingBox, myFormat);
      return regions[0].GetBounds(g);
   }
}

RectangleFとして指定された境界ボックスに従って、必要に応じてワードラップされた、テキスト文字列全体のサイズのを返します__boundingBox。プラス面では、Graphicsオブジェクトはステートメントが完了するとすぐに破棄されusingます…</p>

余談ですが、GDI+ はこの点ではかなり信頼性が低いようです。非常にバグがあることがわかりました (たとえば、私の質問「Graphics.MeasureCharacterRanges が C#.Net で間違ったサイズの計算をしていますか?」</a> を参照してください)。TextRenderer.DrawTextfromを使用できる場合は、使用System.Windows.Formsしてください。

于 2010-04-20T10:38:49.323 に答える
1

画像を完成させるには、GraphicsPath を使用して簡単に行うことができます。これは、DeviceContext を必要としないため、より優れています。

Dim p As New GraphicsPath

Using stringFormat As New StringFormat()
    stringFormat.Trimming = StringTrimming.EllipsisCharacter
    stringFormat.LineAlignment = StringAlignment.Center
    stringFormat.Alignment = StringAlignment.Near

    p.AddString(text, font.FontFamily, font.Style, font.SizeInPoints, Point.Empty, stringFormat)
End Using

Return p.GetBounds.Size

text は特定の文字列で、font は特定のフォントです。SizeF 構造体を返します。結果は、Graphics.MeasureString aka GdipMeasureString-API よりもはるかに正確であることがわかりました。

于 2011-11-21T14:29:47.883 に答える