Мне интересно, есть ли простой способ вычислить текстовый экстент строки (аналогично GetTextExtentPoint32 ), но позволяет мне указать DPI для использования в расчете,Другими словами, есть ли функция, которая делает именно то, что делает GetTextExtentPoint32 , но позволяет мне передавать DPI в качестве параметра или способ «обмануть» GetTextExtentPoint32 в использовании DPIчто я могу уточнить?
Прежде чем вы спросите: «С какой стати вы хотите это сделать?», я постараюсь объяснить, но потерпите, причины этого запроса несколько связаны.
В конечном счете, это для пользовательского алгоритма переноса слов, который разбивает длинную строку на более мелкие блоки текста, которые должны аккуратно помещаться в Crystal Report со сложными требованиями к макету текста (он имитирует бумажную форму, используемую полицейскими дляподавать уголовные жалобы, поэтому за макет отвечает государство, а не мы, и оно должно почти точно соответствовать бумажной форме.
Crystal Reports не может правильно выложить этот текст без посторонней помощи (текст должен помещаться внутри небольшого прямоугольника на одной странице, за которым следуют «стандартные» страницы продолжения, если текст переполняет маленькийблок), поэтому я написал код, разбивающий текст на несколько «блоков», которые хранятся в базе данных отчетов и затем отображаются в отчете по отдельности.
С учетом требуемых измерений (в логических дюймах) и шрифтаинформация, код сначала подгоняет текст к требуемой ширине, вставляя разрывы строк, а затем разбивает его на блоки правильного размера на основе высоты текста.Алгоритм использует функции VB6 TextHeight и TextWidth для вычисления экстентов, который возвращает те же результаты, что и функция GetTextExtentPoint32 (я проверял).
Этот код прекрасно работает, когда для дисплея установлено значение 96 точек на дюйм, но он имеет разрешение 120 точек на дюйм: в некоторых строках больше слов, чем в 96 точек на дюйм.
Например, «Быстрая коричневая лиса перепрыгивает через ленивую собаку» может сломаться следующим образом:
При 96 DPI
Theбыстрая коричневая лиса перепрыгивает через
ленивую собаку
при 120 DPI
быстрая коричневая лиса перепрыгивает через
ленивую собаку
Этот текст затем разбивается на Crystal Reports, поскольку первая строка больше не помещается в соответствующее текстовое поле отчета, поэтому фактический вывод отчета выглядит следующим образом:
Быстрая коричневая лиса перепрыгивает через
ленивую собаку
Сначала я подумал, что смогу компенсировать это, масштабируя результаты TextHeight и TextWidth снизился на 25%, но, видимо, жизнь не так проста: кажется, что многочисленные ошибки округления появляются (и, возможно, другие факторы?), так что экстент текста любой данной строки никогда не будет точно 25% больше при 120 DPI по сравнению с 96 DPI.Я не ожидал, что он отлично масштабируется, но иногда он даже не близок (в одном тесте ширина при 120 DPI была только на 18% больше, чем при 96 DPI).
Этого не происходитк любому тексту в отчете, который обрабатывается непосредственно Crystal Report: похоже, он очень хорошо масштабирует все, чтобы отчет был точно такой же, с 96 DPI и 120 DPI (и даже 144 DPI).Даже при печати отчета текст печатается в точности так, как он отображается на экране (т. Е. Он действительно выглядит как WYSIWYG).
Учитывая все это, поскольку я знаю, что мой код работает на 96 DPI, я долженбыть в состоянии решить эту проблему, рассчитав все мои текстовые экстенты с разрешением 96 DPI, даже если в настоящее время Windows использует другой параметр DPI.
Другими словами, я хочу, чтобы результат моей функции FitTextToRect возвращал тот же вывод при любом значении DPI, заставляя вычислять экстенты текста с использованием 96 DPI.Это должно сработать, так как я преобразую экстенты обратно в дюймы, а затем сравниваю их с требуемой шириной и высотой в дюймах.Я думаю, именно так получилось, что 96 DPI дает более точные результаты, чем 120 DPI, при преобразовании туда-сюда между пикселями и дюймами.
Я пролил на Windows Функции шрифтов и текста, посмотрев, может ли моя собственная функция вычислить экстент текста для заданного DPI, просмотрев GetTextMetrics и другие функции, чтобы увидеть, насколько это легко или сложносделать.Если есть более простой способ сделать это, я хотел бы знать, прежде чем я начну создавать свои собственные версии существующих функций Windows API!