Добавьте к великому ответу батинени:
Справочная информация. Мне нужно было измерить высоту вывода 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))