丰富编辑会渲染某些Unicode字符的问题

时间:2019-06-26 17:31:11

标签: winapi mfc richedit

有一个使用RichEdit 2.0控件的Windows程序(MFC,MBCS)(基本上是一个CRichEditView。当我在Windows 10上为字符串设置控件的文本时,该字符串会正确显示,但在较小的版本上显示,例如在Server 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上发生的事情是丰富的编辑控件很智能,并且可以将警告符号字符的字体自动转换为“ Segoe UI Symbol”。在Server 2016上,它不执行自动转换,并且字体保留其“ Courier New”字体。

现在,用户可以将HTML格式的字符放入MBCS字符串字段中,例如“⚠”。然后,我们将其转换为unicode字符串,并进行丰富的编辑。

我希望能够检测所选字体是否不支持这些字符之一,如果不支持,请更改该字符的字体。

简便的方法吗?

0 个答案:

没有答案