WinForms: Измерить текст без прокладки

В приложении WinForms я пытаюсь измерить размер какого-либо текста, который я хочу рисовать без заполнения . Вот ближайший я получил ...

    protected override void OnPaint(PaintEventArgs e) {
        DrawIt(e.Graphics);
    }

    private void DrawIt(Graphics graphics) {
        var text = "123";
        var font = new Font("Arial", 32);
        var proposedSize = new Size(int.MaxValue, int.MaxValue);
        var measuredSize = TextRenderer.MeasureText(graphics, text, font, proposedSize, TextFormatFlags.NoPadding);
        var rect = new Rectangle(100, 100, measuredSize.Width, measuredSize.Height);
        graphics.DrawRectangle(Pens.Blue, rect);
        TextRenderer.DrawText(graphics, text, font, rect, Color.Black, TextFormatFlags.NoPadding);
    }

... но как вы можете видеть из результатов ...

введите описание изображения здесь

... по-прежнему имеется значительное количество отступов, особенно сверху и снизу. Есть ли способ измерить фактические границы рисованных символов (с чем-то действительно ужасным, как печать на изображение, а затем поиск окрашенных пикселей)?

Заранее спасибо.

c#,winforms,drawtext,

1

Ответов: 2


2 принят

(Я отметил этот ответ как «ответ», так что люди знают, что ему ответили, но @TaW фактически предоставил решение - см. Его ссылку выше.)

@TaW - Это был трюк. Я все еще изо всех сил пытаюсь заставить текст идти туда, где я хочу, но я над горбом. Вот код, который я закончил с ...

    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        DrawIt(e.Graphics);
    }

    private void DrawIt(Graphics graphics) {
        var text = "123";
        var font = new Font("Arial", 40);
        // Build a path containing the text in the desired font, and get its bounds.
        GraphicsPath path = new GraphicsPath();
        path.AddString(text, font.FontFamily, (int)font.Style, font.SizeInPoints, new Point(0, 0), StringFormat.GenericDefault);
        var bounds = path.GetBounds();
        // Move it where I want it.
        var xlate = new Matrix();
        xlate.Translate(100, 100);
        path.Transform(xlate);
        // Draw the path (and a bounding rectangle).
        graphics.DrawPath(Pens.Black, path);
        bounds = path.GetBounds();
        graphics.DrawRectangle(Pens.Blue, bounds.Left, bounds.Top, bounds.Width, bounds.Height);
    }

... и вот результат (обратите внимание на красивую, жесткую ограничительную рамку) ...

введите описание изображения здесь


Ты пробовал

Graphics.MeasureString("myString", myFont, int.MaxValue, StringFormat.GenericTypographic)

C #, WinForms, DrawText,
Похожие вопросы