3

ドキュメントにテキストをレンダリングするときに問題が発生します。具体的には、テキストのレンダリングが低すぎます。テキストの後ろに長方形を塗りつぶして何が起こるかを確認しようとしましたが、わずかにオフセットされているように見えることがわかりました。

同じ長方形を使用して、背景からテキストをオフセットします。

ボックスとテキストのレンダリングに使用したコードは次のとおりです。

_doc.FillRectangle(Colors.LightGray, 36, 72, 37.344, 9);
_doc.DrawString("Lorem", new Font("Arial", 12), Colors.Black, 
   new Rect(36, 72, 37.344, 9));

長方形(9)の高さがフォント(12)の高さと一致していないように見えることは知っていますが、これは最初は問題だったのではないかと思いました。ただし、フォント自体に対してMeasureStringを実行したところ、フォントの高さが実際には12ではなく9であることがわかりました(これにはイミディエイトウィンドウを使用したため、テキストブロックではなく写真です)。

MeasureStringを呼び出したイミディエイトウィンドウの結果。

何がそれを引き起こしている可能性があり、それを回避する方法についてのアイデアはありますか?

ありがとう!

-アリ

4

3 に答える 3

1
  • WPFテキストレンダリングの不整合について説明している投稿がいくつかあります。

  • 他の投稿の1つ:WPFテキストレンダリングの問題。SnapToDevicePixelsテキストがピクセル間で表示されるようにサイズ変更された場合、テキストレンダリングが台無しになる可能性があると述べています。提案された答えは、維持することでした、

    SnapToDevicePixels = True on borders/backgroundsただし、オフにしtext elementsます。

  • 現在使用している方法は。以前の投稿の1つをご覧ください:ボタンをクリックして棒グラフの値を増やす:以前は。DrawString()内に文字を追加していましたrectangle。すべての描画はで行われPanelます。

コード:..。

   panel1.Paint += new PaintEventHandler(panel1_Paint);

        using (Graphics g = this.panel1.CreateGraphics())
        {
            Brush brush = new SolidBrush(Color.Green);
            g.FillRectangle(brush, px, py, 20, 20);                           
            Pen pen = new Pen(new SolidBrush(Color.White));
            g.DrawRectangle(pen, px, py, 20, 20);                    

            //add each total5Click into chart block
            g.DrawString((total5Times).ToString(), new Font("Arial", 7), 
            new SolidBrush(Color.AntiqueWhite),
            px + 1, py+8, StringFormat.GenericDefault);
            pen.Dispose();}
    ...
于 2012-12-31T20:46:42.527 に答える
0

DrawString Method (String, Font, Brush, RectangleF, StringFormat)メソッドを使用して文字列形式を指定することをお勧めします。ComponentOne を確認した後、いくつかのメソッドをまとめているように見えるので、メソッドに設定されている StringFormat のデフォルトに問題がある可能性があります。メインの DrawString メソッドを呼び出し、デフォルトのパラメーターが指定されていない場合はそれを渡していると思います。

のセクションも必ず確認してください。

LineAlignment を使用して、文字列の垂直方向の配置を指定します。

下のリンクで

メソッドへのリンク

于 2012-12-31T20:40:31.460 に答える
0

さらなる調査と実験の結果、ComponentOne ライブラリには間違いなくバグがあります。具体的には、ここでたまたま使用したオーバーロードが間違った高さを返しました。使用可能な幅を明示的に指定すると、正しい高さが得られます。具体的には、次のコードは正しいデータを生成します。

var resultHeight = _doc.MeasureString(text, pdfFont, double.MaxValue).Height;
var resultWidth = _doc.MeasureString(text, pdfFont).Width;

return new Tuple<double,double>(resultHeight, resultWidth);

高さのみの 3 番目のパラメーターが追加されていることに注意してください -- double.MaxValue。幅はどちらの場合も正しく計算されますが、高さはそのパラメーターを指定した場合にのみ正しく計算されdoubleます。double.MaxValueこの場合、文字列の幅がどのくらいになるかわからないので、複数行の高さを指定される危険を冒したくないという単純な理由で選択しました。

于 2013-01-10T01:05:19.007 に答える