为什么CEdit控件不显示特殊字符,如™(商标)? 例如,使用CEdit控件创buildCDialog,并将对话标题和CEdit控件设置为相同的CString,并获得不同的结果。
CString s(_T("ShowTM ™")); SetWindowText(s); //Set Dialog Title (shows ™) editCtrl.SetWindowText(s); //Set Edit Control (does not show ™)
感谢Christian和Paul。 在你的帮助下,我能够拼凑出发生了什么事情。 结论可能有缺陷,但Visual Studio使用默认字体属性创建对话框
FONT 8, "MS Sans Serif"
MS Sans Serif只能被Windows Me / 95/98使用,而且缺少我需要的字符。
今天的默认字体是
FONT 8, "MS Shell Dlg"
MS Shell Dlg不是一个真正的字体,而是一个占位符Windows稍后根据Windows的版本映射到一个真正的字体。 Windows XP / Vista / 7等映射到微软 (而不是MS )Sans Serif有我需要的字符。
我相信Windows是动态映射MS Sans Serif到Microsoft Sans Serif的CDialog,但不是CEdit和
editCtrl.SetWindowTextW( _T("Hello ™"));
因为新的对话框使用MS Shell Dlg字体,因此得到Microsoft Sans Serif的完整字符集。
鉴于这是遗留的代码,我刚刚下面200显式MS San Serif参考应该更新到MS Shell Dlg。 好极了!
有关字体映射的更多详细信息,请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/dd374112%28v=vs.85%29.aspx 。
在诊断这种东西的时候,一个很好的测试就是尝试将文本从正在运行的应用程序中复制出来,并将其粘贴到符合Unicode的文本编辑器中。
如果最终显示符号完整,那么你有一个字体/渲染类型的问题。
在这种情况下,你的问题是MS San Serif本身。 简而言之,它很糟糕。 出于某种原因,某些特殊字符似乎有黑框。 所以这个字体是有意渲染的。
这里有几个截图使用我曾经做过的测试字符和字体的小应用程序。
宋体:
和MS Sans Serif一样:
注意TM符号等是一个盒子。
所以解决办法是:不要使用MS Sans Serif。
现在,为什么当你的CDialog使用MS Sans Serif时,标题栏不会受到影响? 因为对话框的字体会影响客户端区域中其余文本的呈现,而不是窗口的标题。 (其实我不确定你甚至可以影响字幕的字体,而不是完全接管它的渲染,否则使用system / personalization / theme / whatever设置指定的内容)。
使用SetWindowTextW
而不是SetWindowText
以便可以处理Unicode。
editCtrl.SetWindowTextW( _T("Hello ™"));