Отображение азиатских символов (с Unicode): разница в межсимвольном интервале при представлении в элементе управления RichEdit по сравнению с использованием ExtTextOut
Эта картина иллюстрирует мое затруднительное положение:
Все символы имеют одинаковый размер, но пространство между ними различается при представлении в элементе управления RichEdit по сравнению с тем, когда я использую ExtTextOut.
Я хотел бы представить символы так же, как в элементе управления RichEdit (в идеале), чтобы сохранить положение переноса.
Может кто-нибудь сказать мне:
а) Какое представление более правильное?
б) Почему элемент управления RichEdit отображает текст без пробелов между азиатскими символами?
c) Есть ли способ заставить ExtTextOut воспроизводить поведение элемента управления RichEdit при рисовании этих символов?
г) Было бы что-то другое, если бы я работал над азиатской версией Windows?
Возможно, я настроен оптимистично, но если у кого-нибудь есть какие-либо подсказки, мне было бы очень интересно услышать.
Если это поможет:
Вот мой текст:
快的棕色狐狸跳在懶惰狗1 2 3 4 5 6 7 8 9 0
извиняюсь перед азиатскими читателями, это просто для тестирования нашей реализации Unicode, и я даже не знаю, с какого языка взяты символы, не говоря уже о том, означают ли они что-нибудь
Чтобы просмотреть эффект, вставив эти символы в элемент управления RichEdit (например, Wordpad), может потребоваться провести их пальцем по экрану и установить для шрифта значение "Arial".
Расширенный текст, который я получаю:
{\ rtf1 \ ansi \ ansicpg1252 \ deff0 \ deflang2057 {\ fonttbl {\ f0 \ fnil \ fcharset0 Arial;}} {\ colortbl; \ red0 \ green0 \ blue0;} \ viewkind4 \ uc1 \ pard \ sa200 \ sl276 \ slmult1 \ lang9 \ fs22 \ u30340?\u26837?\u33394?\u29392?\u36339?\u22312?\u25078?\u29399?1 2 3 4 5 6 7 8 9 0\ пар \ пард \'a3 $$ \'80\'80\cf1\lang2057\fs16\par}
Кажется, он не содержит значения для тона персонажа, который был моей первой мыслью.
3 ответа
Я не знаю ответа, но есть несколько подозреваемых вещей:
- Существует несколько версий элемента управления rich edit. Возможно, вы используете более старую версию, в которой нет всех последних типографских улучшений.
- Есть много стилей и флагов, которые влияют на поведение расширенного editcontrol, поэтому вы можете захотеть узнать, какие из них установлены и что они делают. Например, посмотрите на EM_GETEDITSTYLE.
- Многие азиатские шрифты доступны в двух версиях для Windows. Один оптимизирован для горизонтального расположения, а другой для вертикального размещения. Последний обычно имеет то же имя, но имеет
@
подготовлен к этому. Возможно, вы используете неправильный элемент в элементе управления rich edit.
ОБНОВЛЕНИЕ: возясь с Wordpad, я смог воспроизвести проблему с переполненным текстом в элементе управления rich edit.
- Откройте новый документ в Wordpad в Windows 7. Обратите внимание, что выбран шрифт Calibri.
- Вставьте образец текста в документ.
- Текст отображается правильно, но Wordpad изменил шрифт на SimSun.
- Выделите текст и измените шрифт обратно на Calibri или Arial.
Текст теперь будет переполнен, очень похоже на ваш пример. Таким образом, кажется, что основная проблема связана со связыванием шрифтов и отступлением. ExtTextOut
вероятно, выбирает подходящий шрифт для скрипта автоматически. Ваша задача - выяснить, как определить правильный шрифт для скрипта и установить этот шрифт в элементе управления rich edit.
ExtTextOut позволяет указать логический интервал между записями. Он имеет параметр lpDx, который является постоянным указателем на массив значений, которые указывают расстояние между источниками смежных символьных ячеек. В документации Microsoft API отмечается, что если вы не установите его, он устанавливает собственный интервал по умолчанию. Я должен сказать, что именно поэтому ExtTextOut работает нормально.
В частности, когда вы создаете запись EMR_EXTTEXTOUTW в EMF, она заполняет структуру EMR_TEXT этим массивом DX, который, глядя на один из ваших комментариев, позволил RichEdit вставить EMF с информацией, содержащейся в записи, в результате чего, если вы этого не сделали t установить привязку шрифта, тогда RTF-запись выполняет некоторое сопоставление, чтобы определить, какой шрифт использовать.
С точки зрения элемента управления RichEdit может пригодиться следующая статья:
Используйте привязку шрифта в элементе управления Edit
После того, как наборы символов назначены, Rich Edit сканирует текст вокруг точки вставки вперед и назад, чтобы найти ближайшие шрифты, которые использовались для наборов символов. Если для набора символов шрифт не найден, Rich Edit использует шрифт, выбранный клиентом для этого набора символов. Если клиент не указал шрифт для набора символов, Rich Edit использует шрифт по умолчанию для этого набора символов. Если клиенту нужен какой-то другой шрифт, он всегда может его изменить, но этот подход будет работать большую часть времени. Текущий выбор шрифта по умолчанию основан на следующей таблице. Обратите внимание, что шрифты по умолчанию устанавливаются для каждого процесса, и существуют отдельные списки для использования пользовательского интерфейса и не для пользовательского интерфейса.
Если вы не установили набор символов, то это дополнительно объясняет, что он возвращается к ANSI_CHARSET. Однако, это определенно намного сложнее, чем это, как показывает эта статья в блоге Мюррея Сарджента (программиста в Microsoft).
Это поможет только в части вашей проблемы, но есть способ отрисовки текста в DC, который будет выглядеть точно так же, как в RichEdit: так называемый элемент управления RichEdit без окон. Он не совсем прост в использовании: я написал статью о CodeProject несколько лет назад. Я использовал это, чтобы решить проблему прокручиваемого отображения блоков текста, каждый из которых можно редактировать, щелкнув по нему: обычное рисование выполняется с помощью RichEdit без окон, а редактирование - с помощью "реального" элемента управления RichEdit на вершина этого.
По крайней мере, в обоих случаях текст будет выглядеть одинаково, хотя, к сожалению, в обоих случаях будет слишком мало пробелов.
Еще одна мысль: если вы можете рассчитывать на установку Microsoft Office, вы также можете попробовать более поздние версии RichEdit, которые поставляются с офисом. Об этом можно узнать в блоге Мюррея Сарджента, а также о некоторых интересных статьях по связыванию шрифтов, которые также могут помочь.