如何确保在Windows 10上将数字呈现为阿拉伯数字?

时间:2018-03-30 23:20:03

标签: c++ winapi numbers windows-10

我的应用程序允许用户通过选择用户首选语言来自定义UI。它通常很有用,除了在Windows 10上,例如,如果在Windows控制面板中选择用户区域设置为Cambodian

enter image description here

但是如果我应用的用户界面中的用户选择US English,我似乎找不到用“美国英语数字”来呈现它的方法。在Windows 8.1上,无论选择何种语言环境,它都会以这种方式结束:

enter image description here

我的假设是,人们不需要翻译数字。但是在Windows 10上,同样的控件最终看起来像这样:

enter image description here

请注意,仅使用此调用设置其文本:

::SetWindowText(m_hWnd, L"1000");

所以我很好奇,有没有办法让数字呈现为阿拉伯数字:

enter image description here

1 个答案:

答案 0 :(得分:1)

这个问题比基本控件更深入,它发生在GDI内部,也影响DrawTextTextOut。唯一记录在案的方法是使用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"等