Отображение азиатских символов (с Unicode): разница в межсимвольном интервале при представлении в элементе управления RichEdit по сравнению с использованием ExtTextOut

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

Image1

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

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

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

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

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

c) Есть ли способ заставить 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 \ u30340? \ u23937? \ u33394? \ u29392? \ u36339? \ u22312? \ u25078? \ u29399? 1 2 3 4 5 6 7 8 9 0 \ par \ pard \ 'a3 $$ \ '80 \ '80 \ cf1 \ lang2057 \ fs16 \ par}

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

4 голоса | спросил Coder_Dan 23 FebruaryEurope/MoscowbWed, 23 Feb 2011 17:22:37 +0300000000pmWed, 23 Feb 2011 17:22:37 +030011 2011, 17:22:37

3 ответа


0

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

  • Существует несколько версий элемента управления 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.

ответил Adrian McCarthy 24 FebruaryEurope/MoscowbThu, 24 Feb 2011 21:28:13 +0300000000pmThu, 24 Feb 2011 21:28:13 +030011 2011, 21:28:13
0

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).

ответил Chris Sherlock 15 Jam1000000amThu, 15 Jan 2015 04:13:25 +030015 2015, 04:13:25
0

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

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

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

ответил DavidK 1 MaramTue, 01 Mar 2011 11:49:28 +03002011-03-01T11:49:28+03:0011 2011, 11:49:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132