有一个使用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字符串,并进行丰富的编辑。
我希望能够检测所选字体是否不支持这些字符之一,如果不支持,请更改该字符的字体。
简便的方法吗?