为什么CEdit控件不显示特殊字符,例如™(商标)?例如,使用CEdit控件创建一个CDialog,并将Dialog标题和CEdit控件设置为相同的CString并获得不同的结果。
CString s(_T("ShowTM ™"));
SetWindowText(s); //Set Dialog Title (shows ™)
editCtrl.SetWindowText(s); //Set Edit Control (does not show ™)
答案 0 :(得分:3)
感谢克里斯蒂安和保罗。在你的帮助下,我能够将正在发生的事情拼凑起来。结论可能存在缺陷,但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映射到用于CDialog的Microsoft Sans Serif,但不是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。
答案 1 :(得分:2)
在诊断此类内容时,一个很好的测试是尝试将文本从正在运行的应用程序中复制出来并将其粘贴到兼容的Unicode兼容的文本编辑器中。
如果最终显示符号完整,那么你就会遇到字体/渲染问题。
在这种情况下,您的问题是MS San Serif本身。简单地说,它很糟糕。出于某种原因,某些特殊字符似乎有黑框。因此,该字体有意地以这种方式呈现它们。
以下是使用我曾经用于测试字符和字体的小应用程序的几个截图。
Arial字体:
在MS Sans Serif中也是如此:
请注意,TM符号是一个框。
所以解决方法是:不要使用MS Sans Serif。
现在,当您的CDialog使用MS Sans Serif时,为什么标题栏不受影响?因为对话框的字体会影响客户区域中其余文本的呈现,而不会影响窗口的标题。 (实际上我不确定你是否可以影响字幕的字体而不完全接管它的渲染。否则它使用系统/个性化/主题/任何设置指定的内容。)
答案 2 :(得分:1)
Use The length of 'back' is 4
instead of SetWindowTextW
so that the Unicode
can be processed.
SetWindowText