-1

長方形内のテキストを測定したいのですが、フォーマット フラグに TextFormatFlags.SingleLine が含まれている場合にのみ正しく機能します。

例えば。フォームにパネルを配置し、この Paint イベント ハンドラーを追加します。

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        TextFormatFlags flags = TextFormatFlags.SingleLine | TextFormatFlags.VerticalCenter | TextFormatFlags.Left;
        Panel panel = (sender as Panel);

        //Draw the text
        TextRenderer.DrawText(e.Graphics, "hello", SystemFonts.DefaultFont, new Rectangle(0, 0, panel.Bounds.Width, panel.Bounds.Height), Color.Red, flags);

        //Draw a border around the panel
        e.Graphics.DrawRectangle(System.Drawing.Pens.Black, 0, 0, panel.Width - 1, panel.Height - 1);

        //Measure the text and draw a rect around it
        Size s = TextRenderer.MeasureText(e.Graphics, "hello", SystemFonts.DefaultFont, new Size(panel.Bounds.Width, panel.Bounds.Height), flags);
        e.Graphics.DrawRectangle(Pens.Blue, 0, 0, s.Width, s.Height);


    }

あなたはこれを見るでしょう

作業中のスクリーンショット

ただし、フラグで SingleLine を取り出した場合。

        TextFormatFlags flags =  TextFormatFlags.VerticalCenter | TextFormatFlags.Left;

次に、これを取得します

ここに画像の説明を入力

動作が仕様によるものだとは思いませんが、いずれにせよ、簡単に回避できますか?

ありがとう

4

1 に答える 1

0

申し訳ありませんが、それを書き出すことで、必要な解決策が得られました。

    private Size FixMeasureText(Graphics graphics, string p, Font font, Size size, TextFormatFlags flags)
    {
        Size s = TextRenderer.MeasureText(graphics, p, font, size, flags);
        if ((flags & TextFormatFlags.SingleLine )== 0)//need to fix
        {
            s.Height = ((size.Height - s.Height) / 2 )+ s.Height;
        }
        return s;

    }

したがって、それが本当に TextRenderer.MeasureText のバグである場合、解決策は代わりにこのメソッドを使用することです...

于 2013-08-07T18:45:42.130 に答える