1

文字列を印刷するときに、事前に定義されたキーワードに特別な書式を適用する関数を書いています。たとえば、文字列 - 「なぜこれが機能しないのですか?」「なぜ」という単語を下線付きで青字で印刷する必要があるかもしれません。

これを分割して実装し、文字列の各セグメントを個別の print 呼び出しで出力する必要がありました。このアプローチには 1 つの問題があります。文字列を印刷するときに正しい間隔を取得できません。キーワードが前のデフォルト テキストの上に印刷され、その後に印刷されるテキストと重ねて表示されます。

境界長方形を使用して、文字列を印刷ページに配置しています。

RectangleF rectKeywordBounds = new RectangleF( 60.0,  60.0, 550.0, 1200.0);

文字列のセグメントを印刷したら、四角形のサイズを描画した文字数だけ変更し、文字列の次のセグメントを印刷します。

EArgs.Graphics.DrawString(strFragment, fontBlueItalics, Brushes.Blue, rectKeywordBounds );
iLastPrintIndex = strFragment.Length + iLastPrintIndex;

このメソッドを使用して、新しい文字列セグメントの印刷位置を変更しました。

rectKeywordBounds = new Rectangle(rectKeywordBounds .X + iLastPrintIndex, rectKeywordBounds .Y, rectKeywordBounds .Width, rectKeywordBounds .Height);

そして、私はこれを使用しました:

properSpacing = new SizeF(-((float)iLastPrintIndex), 0.0f);
rectKeywordBounds .Inflate(properSpacing);

どちらの方法でも、同じようにセグメントが重複します。次のコードは、私が期待する方法で外接する四角形を進めますが、四角形内にテキストを印刷するときに概念が機能しないのはなぜですか?

Rectangle rectKeywordBounds = new Rectangle(90, 90, 800, 100);

for (int x = 0; x < 6; x++)
{
    EventArgs.Graphics.DrawRectangle(Pens.BlueViolet, rectKeywordBounds );
    rectKeywordBounds = new Rectangle(rectKeywordBounds .X + 15, rectKeywordBounds .Y + 200, rectKeywordBounds .Width, rectKeywordBounds .Height);               
}
4

1 に答える 1

1

四角形をどれだけ進めるかを計算する方法はわかりません-文字列の長さを使用しているようですが、これは座標値ではなく文字数であるため機能しません。

代わりに、Graphics.MeasureString メソッドを使用して、現在のセグメントを印刷するために必要なスペースを計算し、その分四角形を進めます。すべてのセグメントに同じフォントを使用している場合は、Graphics.MeasureCharacterRanges を使用してこれを一度に行うこともできます。

ところで、GDI+ の代わりに WPF を使用するオプションがある場合は、TextBlock クラスがすべての測定とレイアウトを処理します。

于 2009-09-24T21:15:48.740 に答える