Отображение азиатских символов (с Unicode): разница в межсимвольном интервале при представлении в элементе управления RichEdit по сравнению с использованием ExtTextOut - PullRequest
4 голосов
/ 23 февраля 2011

Это изображение иллюстрирует мое затруднительное положение:

Image1

Все символы имеют одинаковый размер, но расстояние между ними различается при представлении в элементе управления RichEdit по сравнению скогда я использую ExtTextOut.

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

Может кто-нибудь сказать мне:

a) Какое более правильное представление?

b) Почему элемент управления RichEdit отображает текст без пробелов между азиатскими символами?

в) Есть ли способ заставить ExtTextOut воспроизводить поведение элемента управления RichEdit при рисовании этих символов?

d) Было бы иначе, если бы я работална азиатской версии 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\u24555?\u30340?\u26837?\u33394?\u29392?\u29432?\u36339?\u22312?\u25078?\u24816?\u29399?1 2 3 4 5 6 7 8 9 0\par\pard\'a3 $$ \'80\'80\cf1\lang2057\fs16\par}

Похоже, он не содержитзначение для символа 'высота звука', которое было моей первой мыслью.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2011

Я не знаю ответа, но есть несколько подозрений:

  • Существует несколько версий элемента управления rich edit.Возможно, вы используете более старую версию, которая не имеет всех последних типографских улучшений.
  • Существует множество стилей и флагов, которые влияют на поведение расширенного editcontrol, поэтому вы можете захотеть узнать, какие из них установленыи что они делают.Например, посмотрите на EM_GETEDITSTYLE .
  • Многие азиатские шрифты доступны в двух версиях для Windows.Один оптимизирован для горизонтального расположения, а другой для вертикального размещения.Последний обычно имеет то же имя, но к нему добавляется @.Возможно, вы используете неправильный элемент в элементе управления rich edit.

ОБНОВЛЕНИЕ: Возиться с Wordpad, я смог воспроизвести проблему с переполненным текстом в элементе управления rich edit.

  1. Откройте новый документ в Wordpad на Windows 7. Обратите внимание, что выбран шрифт Calibri.
  2. Вставьте образец текста в документ.
  3. Текст отображается правильно, но Wordpadизменил шрифт на SimSun.
  4. Выберите текст и измените шрифт обратно на Calibri или Arial.

Текст теперь будет переполнен, очень похоже на ваш пример.Таким образом, кажется, что основная проблема связана со связыванием шрифтов и отступлениемExtTextOut, вероятно, автоматически выбирает подходящий шрифт для скрипта.Ваша задача - выяснить, как определить правильный шрифт для скрипта и установить этот шрифт в элементе управления rich edit.

1 голос
/ 15 января 2015

ExtTextOut позволяет указать логический интервал между записями. Он имеет параметр lpDx , который является постоянным указателем на массив значений, указывающих расстояние между источниками смежных символьных ячеек. Документация Microsoft API отмечает, что если вы не установите его, то он устанавливает собственный интервал по умолчанию. Я должен сказать, что именно поэтому ExtTextOut работает нормально.

В частности, когда вы создаете запись EMR_EXTTEXTOUTW в EMF, она заполняет структуру EMR_TEXT этим массивом DX - который, глядя на один из ваших комментариев, позволил RichEdit вставить EMF с информацией, содержащейся в записи, что, если вы не установили привязку шрифта, тогда RTF-запись выполняет некоторое сопоставление, чтобы определить, какой шрифт использовать.

С точки зрения элемента управления RichEdit, следующая статья может быть полезна:

Использование привязки шрифта в элементе управления Rich Edit

После того, как наборы символов назначены, Rich Edit сканирует текст вокруг вставить курсор вперед и назад, чтобы найти ближайшие шрифты, которые были использованы для наборов символов. Если шрифт не найден для Набор символов, Rich Edit использует шрифт, выбранный клиентом для этого набор символов. Если клиент не указал шрифт для символа Для этого набора символов Rich Edit использует шрифт по умолчанию. Если клиент хочет другой шрифт, клиент всегда может его поменять, но этот подход будет работать большую часть времени. Текущий шрифт по умолчанию выбор основан на следующей таблице. Обратите внимание, что шрифты по умолчанию устанавливаются для каждого процесса, и существуют отдельные списки для использования пользовательского интерфейса и для использование без пользовательского интерфейса.

Если вы не установили набор символов, то он также объясняет, что он возвращается к ANSI_CHARSET. Однако, это определенно намного сложнее, чем , как показывает эта статья в блоге Мюррея Сарджента (программиста из Microsoft).

0 голосов
/ 01 марта 2011

Это поможет только в части вашей проблемы, но есть способ отрисовки текста в DC, который будет выглядеть точно так же, как и в RichEdit: так называемый элемент управления RichEdit без окон. Его не совсем просто использовать: несколько лет назад я написал статью CodeProject . Я использовал это, чтобы решить проблему прокручиваемого отображения блоков текста, каждый из которых можно редактировать, щелкнув по нему: обычное рисование выполняется с помощью RichEdit без окон, а редактирование - с отображением «настоящего» элемента управления RichEdit на вершина этого.

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

Еще одна мысль: если вы можете рассчитывать на установку Microsoft Office, вы также можете попробовать более поздние версии RichEdit, поставляемые с офисом. Подробнее об этом можно узнать в блоге Мюррея Сарджента , а также о некоторых интересных статьях по связыванию шрифтов, которые также могут помочь.

...