Добавьте к замечательному ответу Батинени:
Справочная информация: мне нужно было измерить высоту вывода RTF для рендеринга на бумагу, и поскольку у меня есть настраиваемые динамические верхние и нижние колонтитулы страниц, которые мне нужны для управления разбиением на страницы).
(RichTextBox.GetLineFromCharIndex подвел меня из-за сложного RTF; включая строки и таблицы с несколькими столбцами с переносом слов).
Как бы то ни было, все работало нормально, пока кто-то другой не использовал мое приложение с ужасными окнами «Сделать текст и другие элементы больше или меньше» (настройки DPI). Короче говоря, теперь, измеряя шрифты большего размера, он испортил вычисления длины страницы. (принтер по-прежнему правильно отображал текст и столбцы - теперь неправильная была только длина страниц.)
Только факторизация разницы в DPI не удалась, так как более крупный текст не помещался должным образом в исходные значения RTF tx и cellx.
Во всяком случае, на случай, если другие делают подобные сумасшедшие вещи, методом проб и ошибок были придуманы следующие (в конечном итоге очень немногие) модификации к методу Bathineni CalculateRichTextHeight:
RichTextBox richTextBox = new RichTextBox(); // same as original
int dpix = richTextBox.CreateGraphics().DpiX; // get dpi
richTextBox.WordWrap = true; // I needed this, you many not
// ... set size etc - same as original answer
richTextBox.Scale(new System.Drawing.SizeF(dpix / 96, dpix / 96)); // scale RTB
// ...
// 96? my original calculations based on windows default 96dpi settings.
Кажется, в остальном непонятный Control.Scale (sizef) действительно для чего-то полезен.
Примечание: при преобразовании результатов в фактические напечатанные строки (в моем случае все мои \ pard были "\ sl-240 \ slmult0", что составляет 16 (пикселей?) На строку) также не забудьте повторно разложить делитель. то есть в моем случае:
lines = height / (int)(16 * (dpix / 96))
person
Rob
schedule
17.10.2014