Определение количества пикселей текста, выходящих за границы текстового поля. - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть функция, которую я использую, чтобы определить, когда строки текста превышают горизонтальные / вертикальные границы текстового поля, она отлично работает для текстового поля, у которого отключена перенос слов:

private bool OverflowsBounds(Direction dir) {
    int textSize;
    var flags = TextFormatFlags.NoClipping | TextFormatFlags.LeftAndRightPadding;
    using(var g = textbox1.CreateGraphics()) {
        if(dir == Direction.Horizontal) {
            if(WordWrap) return false;
            textSize = TextRenderer.MeasureText(g, textbox1.Text, textbox1.Font, new Size(int.MaxValue, int.MaxValue), flags).Width;
        } else {
            textSize = TextRenderer.MeasureText(g, textbox1.Text, textbox1.Font, new Size(int.MaxValue, int.MaxValue), flags).Height;
        }
    }
    int textBounds = dir == Direction.Horizontal ? textbox1.ClientRectangle.Width : textbox1.ClientRectangle.Height;

    return textSize >= textBound;
}

Но когда перенос слов включен, строка, которая переносится на новую строку, считается одной строкой. Так, если, например, высота текстового поля равна 100px, а для каждой строки - 20px, строка, которая обернута в 3 строки, будет 20px вместо 60px - поэтому 2 копии этой перенесенной строки будут определены как занимающие только 40px, когда они на самом деле превышают 100px bounds.

Я попытался внести это изменение:

textSize = TextRenderer.MeasureText(g, textbox1.Text, textbox1.Font, new Size(WordWrap ? textbox1.ClientRectangle.Width : int.MaxValue, int.MaxValue), flags).Height;

И также попытался использовать флаг WordBreak, но ни один из них не решил проблему.

...