ExtTextOut не отображает символы нижнего индекса

#winapi #unicode #fonts #drawtext

#winapi #юникод #шрифты #drawtext

Вопрос:

Я пытаюсь отобразить следующий текст, используя ExtTextOut функцию с Courier New шрифтом:

 C₁C₂C²C³
  

Символы верхнего индекса отображаются нормально, но символы нижнего индекса отображаются в виде блоков. Если я использую DrawText функцию, то символы нижнего индекса отображаются нормально.

У меня создалось впечатление, что это DrawText внутренние вызовы ExtTextOut . Я ошибаюсь или DrawText выполняет некоторую дополнительную обработку строки, чтобы разрешить отображение символов нижнего индекса?

Могу ли я что-нибудь сделать, чтобы заставить ExtTextOut отображать символы нижнего индекса с помощью Courier New шрифта?

Мой код для использования ExtTextOut выглядит следующим образом:

 ExtTextOutW(hdc,x,y,0,0,szText,wcslen(szText),0);
  

Ответ №1:

Как отметил Ханс в комментарии, DrawText() в настоящее время реализован с использованием привязки шрифтов, но может показаться, что ExtTextOut() — нет.

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

Ответ №2:

Если вы получаете прямоугольники вместо символов, то проблема в используемом вами шрифте. В нем нет необходимого глифа. Например, распространенный в XP, у меня он больше не установлен для проверки. Используйте Windows charmap.exe апплет для поиска подходящего шрифта. Нижний индекс 2 является кодовой точкой Unicode ‘x2082’.

Комментарии:

1. Я знаю об этом. При выборе другого (например, Segoe UI) символы нижнего индекса будут отображаться. Однако, почему функция DrawText отображает символы нижнего индекса, даже при использовании нового шрифта Courier? Выполняет ли функция DrawText некоторые дополнительные замены шрифта?

2. Эта функция API относится к каменному веку, она может не реализовывать функцию привязки шрифтов. Не уверен, я не использовал его целую вечность. Справочная информация здесь: msdn.microsoft.com/en-us/goglobal/bb688134.aspx