Как заставить Win32 RichEdit откатиться на SimSun с восточноазиатским текстом?

Я установил связь шрифта с SimSun для своих шрифтов в реестре Windows.
Когда я применяю этот шрифт к моему элементу управления RichEdit, он ведет себя следующим образом:

  • Во-первых, он отображает SimSun - хорошо
  • Когда я добавляю текст, который не является юникодом CKJ, а затем добавляю больше текста в CKJ, выбранным окном шрифта является Microsoft Ya Hei вместо SimSun.

Вот скриншот:

введите здесь описание изображения

Шрифты:

  • "阿哥": SimSun
  • «◎»: символ пользовательского интерфейса Segoe.
  • "[āgē] đại ca" Arial
  • "对兄长的称呼。" Microsoft Ya Hei

Как я могу заставить окно выбрать SimSun вместо Microsft Ya Hei в этом случае?

EDIT
Спасибо @Cody Grey за отличный ответ. Вот рабочий код:

CHARFORMAT2 cf2;

memset(&cf2, 0, sizeof(CHARFORMAT2));
cf2.cbSize = sizeof(CHARFORMAT2);
cf2.dwMask = CFM_FACE | CFM_SIZE | CFM_CHARSET | CFM_LCID;
cf2.lcid = 0x0804;
cf2.yHeight = 280;
cf2.bCharSet = CHINESEBIG5_CHARSET;
wcscpy(cf2.szFaceName, L"SimSun");
SendMessage(rtbhWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_ASSOCIATEFONT, (LPARAM)&cf2);

cf2.cbSize = sizeof(CHARFORMAT2);
cf2.dwMask = CFM_FACE | CFM_SIZE | CFM_CHARSET | CFM_LCID;
cf2.lcid = 0x0409;
cf2.yHeight = 220;
cf2.bCharSet = ANSI_CHARSET;
wcscpy(cf2.szFaceName, L"Segoe UI");
SendMessage(rtbhWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_ASSOCIATEFONT2, (LPARAM)&cf2);

person Tuyen Pham    schedule 14.01.2016    source источник


Ответы (1)


Вы можете установить шрифт по умолчанию для представления символов, отправив элементу управления RichEdit EM_SETCHARFORMAT сообщение с флагом SCF_ASSOCIATEFONT.

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

См. также: Как использовать привязку шрифтов в Rich Edit Controls

Это мне кажется, что Windows 8 представила шрифт "Microsoft YaHei" в качестве шрифта пользовательского интерфейса по умолчанию для письма на упрощенном китайском языке. Я думаю (но я не уверен), что SimSun раньше был шрифтом по умолчанию для этого скрипта, так что это объясняет, если вы видите такое поведение в некоторых системах, а не в других.

person Cody Gray    schedule 14.01.2016
comment
Могу я задать еще один вопрос, можно ли привязать два размера шрифта к двум выбранным шрифтам? Например, если я выбираю абзац, устанавливаю размер шрифта = 100, затем размер шрифта 1 = 100, размер шрифта 2 — 150? - person Tuyen Pham; 14.01.2016
comment
@Tuyen Я не совсем уверен, понимаю ли я твой вопрос. Но, насколько мне известно, масштабирование элемента управления RichEdit является глобальным. Если вы установите коэффициент масштабирования с помощью чего-то вроде EM_SETZOOM, он будет применяться ко всему тексту в элементе управления. Вы не можете установить другой коэффициент масштабирования для отдельных строк текста. Но вы можете просто изменить размер шрифта обычным способом: отправить сообщение EM_SETFONTSIZE, когда у вас уже выделена строка текста. - person Cody Gray; 15.01.2016
comment
@Tuyen Я не совсем уверен, понимаю ли я твой вопрос. Но, насколько мне известно, масштабирование элемента управления RichEdit является глобальным. Если вы установите коэффициент масштабирования с чем-то вроде EM_SETZOOM, он будет применяться ко всему тексту в элементе управления. Вы не можете установить другой коэффициент масштабирования для отдельных строк текста. Но вы можете просто изменить размер шрифта обычным способом: отправить сообщение EM_SETFONTSIZE, когда у вас уже выделена строка текста. - person Cody Gray; 15.01.2016
comment
Например, это не масштабирование: в текстовом диапазоне есть как латинские, так и CJK-буквы. Если я установлю размер шрифта для этого текста на 12, это хорошо для латинских букв, но слишком мало для CKJ. Если мы установим размер шрифта 18, это нормально для CKJ, но слишком велико для латиницы. Один из способов, который я могу сделать, - это разделить этот диапазон на части, каждая из которых содержит только латиницу или CKJ, а затем установить для нее размер шрифта. Но это довольно халтурная работа. Поэтому мне интересно, есть ли какой-либо метод, что-то вроде карты/ссылки размера шрифта каждого шрифта на базовый размер шрифта? Если мы установим базовый размер шрифта для диапазона текста = 12, то размер шрифта 1 = 12, размер шрифта 2 = 12 * 1,5? - person Tuyen Pham; 15.01.2016