Как полностью обосновать тексты программно (Delphi)? - PullRequest
2 голосов
/ 30 октября 2009

Как я могу полностью выровнять блок текста (как это делает MS Word, не только справа и не только слева, но и с обеих сторон)?

Я хочу выровнять некоторые тексты (в основном арабский текст), настроенные для определенного размера экрана (на самом деле это экран некоторых портативных устройств, и его средство просмотра текста не имеет этой функции), и сохранить этот текст как оправданный. Так что я могу перезагрузить и снова использовать его в другом месте.

(Проблема с MS Word заключается в том, что если вы скопируете выровненный текст из MS Word и вставите его в другой редактор, он скопирует его без выравнивания).

Обновление: сейчас я думаю сделать это так:

  1. наймите-слово

  2. получить слово-ширина

  3. add-word-to-total-Word и add-Word-width-total-word-width

  4. проверить, если total-Word-width = myscreen-width, затем продолжить

иначе, если total-Word-width находится между myscree-wdith и (myscreen-width -3), тогда

add-space-To-total-word, пока оно не = myscreen-width

Это то, о чем я сейчас думаю, но я поднял этот вопрос и надеюсь посмотреть, есть ли лучшее решение, или кто-то другой уже реализовал его.

PS: Я надеюсь, что разъяснил свой вопрос, и я прошу прощения за плохое выражение, если есть.

edit1: изменил заголовок, чтобы сделать его более понятным.

Ответы [ 4 ]

3 голосов
/ 30 октября 2009

Если вы хотите выровнять простой текст, вы можете только добавить лишние пробелы к строкам, чтобы выровнять их по левому и правому краям. К сожалению, ширина символов различается шрифтами; выполнение этого способа будет работать только для определенного шрифта, если вы не ограничиваетесь моноширинными шрифтами, в которых все символы имеют одинаковый размер.

Если вы хотите получить результат, подобный Word, добавление пробелов не приведет к его сокращению. Word не добавляет пробелы, но растягивает и уменьшает существующие пробелы. Эта информация теряется при копировании и вставке в другое приложение.

В любом случае, оправдание является проблемой оптимизации. Если вы заинтересованы в хорошем решении и его реализации: взгляните на TeX . Для реализации, которая работает с простым текстом с моноширинными шрифтами, взгляните на par

1 голос
/ 31 октября 2009

Есть несколько вызовов API, которые могут помочь:

ExtTextOut и GetCharacterPlacement

Посмотрите на флаг GCP_JUSTIFY для GetCharacterPlacement

ExtTextOut используется Canvas.TextRect

0 голосов
/ 31 октября 2009

Как указывалось в других ответах, Word полностью оправдывает себя, растягивая существующие пробелы часто на очень небольшие величины. Это возможно, только если у вас есть полный контроль над тем, как ваш текст отображается на экране (какое слово - или любая другая программа Windows).

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

Извините, я не могу вам помочь.

0 голосов
/ 30 октября 2009

Проблема, с которой вы столкнетесь, всегда будет заключаться в различиях в отображении шрифта. Word обрабатывает полное выравнивание, настраивая кернинг , а также несколько (в любом случае) количество пикселей между словами. Конечный результат выстраивается в обе стороны. Эта корректировка пикселей выполняется ОБА и максимально равномерно.

Чтобы правильно обработать это в вашем портативном устройстве, вам также придется выполнить тот же алгоритм для отображения текста там.

Если это невозможно, то ЕДИНСТВЕННЫЙ способ, которым вы можете даже приблизиться, заключается в добавлении пробела между словами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...