Проблемы с расширенным редактированием при отображении определенных символов Юникода - PullRequest
2 голосов
/ 26 июня 2019

Иметь программу Windows (MFC, MBCS), которая использует элементы управления RichEdit 2.0 (как в основном CRichEditView. Когда я устанавливаю текст элемента управления для строки в Windows 10, строка отображается правильно, но в более мелких версиях, скажем,На сервере 2016 есть символ, который не отображает правильно. Невозможно действительно предоставить полный пример, но вы можете получить суть из нескольких строк.

   // m_rich is a CRichEditCtrl for this example...
   CHARFORMAT cf = { sizeof(cf), CFM_FACE | CFM_SIZE, 0, 16 * 20 };// 16 pt font easy to see
   _tcscpy_s(cf.szFaceName, _countof(cf.szFaceName), _T("Courier New"));
   m_rich.SetDefaultCharFormat(cf);

   SETTEXTEX st = { 0, 1200 };
   WCHAR wsz[] = L"This is the symbol \u26a0 in the middle";
   ::SendMessage(m_rich.GetSafeHwnd(), EM_SETTEXTEX, (WPARAM) &st, (LPARAM) wsz);

В Windows 10 расширенное редактирование отображаетпредупреждающий символ (⚠). Но на Server 2016 он просто отображает его как пустое поле. Предположительно, это связано с тем, что символ не поддерживается шрифтом.

После изучения событий я обнаружил, что происходит наWindows 10 - это интеллектуальный элемент управления rich edit, который автоматически преобразует шрифт для символа предупреждающего символа в «Segoe UI Symbol». На Server 2016 автоматическое преобразование не выполняется, а шрифт сохраняет «Courier New».шрифт.

Теперь пользователь может поместить символ в формате HTML в поле строки MBCS иногданг вроде "⚠".Затем мы конвертируем его в строку в юникоде и помещаем в расширенное редактирование.

Я хотел бы иметь возможность определить, не поддерживается ли один из этих символов выбранным шрифтом, и, если нет, изменитьшрифт для символа.

Простой способ сделать это?

...