为什么CEdit控件不显示特殊字符,例如™(商标)?例如,使用CEdit控件创建一个CDialog,并将Dialog title和CEdit控件设置为相同的CString,则会得到不同的结果。
CString s(_T("ShowTM ™"));
SetWindowText(s); //Set Dialog Title (shows ™)
editCtrl.SetWindowText(s); //Set Edit Control (does not show ™)

发布于 2015-05-13 09:28:11
谢谢克里斯蒂安和保罗。有了你的帮助,我才能把正在发生的事情拼凑起来。结论可能有缺陷,但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等映射到Microsoft (而不是MS) Sans Serif,它具有我需要的字符。
我相信Windows正在动态地将MS Sans Serif映射到Microsoft Sans Serif for 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。
发布于 2015-05-13 08:16:55
在诊断这类问题时,一个很好的测试是尝试将文本从正在运行的应用程序中复制出来,并将其粘贴到一个与Unicode兼容的文本编辑器中。
如果最终显示的是原样的符号,那么你就有了一个字体/渲染的问题。
在这种情况下,您的问题出在MS San Serif本身。简单地说,它很糟糕。出于某种原因,它似乎为某些特殊字符设置了黑盒。所以该字体有意地以这种方式呈现它们。
这里有几个屏幕截图,使用的是我曾经开发的测试字符和字体的小应用程序。
Arial:

在MS Sans Serif中也是如此:

请注意,其中的TM符号是一个框。
因此,解决方案是:不要使用MS Sans Serif。
那么,当你的CDialog使用MS Sans Serif时,为什么标题栏不受影响呢?因为对话框的字体会影响工作区中其余文本的呈现,而不是窗口标题。(实际上,我不确定您是否可以在不完全接管字幕呈现的情况下影响字幕的字体。否则,它将使用系统/个性化/主题/其他设置指定的内容。)
发布于 2015-05-13 06:15:20
使用Unicode而不是SetWindowText,以便可以处理Unicode。
editCtrl.SetWindowTextW( _T("Hello ™"));

https://stackoverflow.com/questions/30202074
复制相似问题