我的应用程序允许用户通过选择用户首选语言来自定义UI。它通常很有用,除了在Windows 10上,例如,如果在Windows控制面板中选择用户区域设置为Cambodian
:
但是如果我应用的用户界面中的用户选择US English
,我似乎找不到用“美国英语数字”来呈现它的方法。在Windows 8.1上,无论选择何种语言环境,它都会以这种方式结束:
我的假设是,人们不需要翻译数字。但是在Windows 10上,同样的控件最终看起来像这样:
请注意,仅使用此调用设置其文本:
::SetWindowText(m_hWnd, L"1000");
所以我很好奇,有没有办法让数字呈现为阿拉伯数字:
答案 0 :(得分:1)
这个问题比基本控件更深入,它发生在GDI内部,也影响DrawText
和TextOut
。唯一记录在案的方法是使用ExtTextOut
标记调用ETO_NUMERICSLATIN
(或使用Uniscribe渲染文本)。
This behavior is completely by design
这些标志只根据需要修改U + 0030 - U + 0039
因为事实是GDI并没有给出关于格式化或实际上与语言环境相关的任何事情的废话,只有一个例外:Digit Substitution
每次去渲染文本时,它都会抓取用户区域设置中的数字替换设置(包括用户覆盖信息),并使用信息来决定如何显示数字。
另一件似乎有效的方法是使用GREEK_CHARSET字符集强制使用自定义字体。该charset触发font association magic feature。 (EE_CHARSET似乎也适用于英文文本)。如果要执行此操作,您可能必须尝试为每种语言选择最佳字符集,但不能使用ANSI_CHARSET或DEFAULT_CHARSET。
如果不知道为什么这只发生在Windows 10中,但它在某些地方看起来确实是一个错误。例如,在资源管理器中,它将显示" 7-Zip" as" 7-Zip"等