Windows窗体中数字键盘十进制键的特定于文化的处理

保罗·威廉姆斯

我们有一个带有大量自定义控件的.NET 2.0 Windows Forms应用程序。几年前,我们对应用程序进行了全球化,因此用户可以看到适当的针对特定文化的符号和翻译。

一位加拿大加拿大客户要求我们更改应用程序处理数字键盘十进制键的方式。当用户按下此键时,我们的数字控件不执行任何操作。

我将Windows区域设置切换为“法语-加拿大”并调试了应用程序。我看到当前的文化和当前的UI文化都设置为fr-CA。

在OnKeyDown和OnKeyPress中,我看到了键盘时间段(Keys.OemPeriod)和数字键盘时间段(Keys.Decimal)之间的差异。具体的击键出现在OnKeyDown中。但是,在两种情况下,OnKeyPress事件都会为我们的控件提供一个时期:

Key               OnKeyDown      OnKeyPress
================= ============== ==========
Main Keyboard     Keys.OemPeriod "." 
Number Pad Period Keys.Decimal   "."

我们的数字控件处理OnKeyPress事件中的数字输入。由于在当前区域性中,句点不是小数点分隔符,因此控件会拒绝此字符。

全球化设置是应该自动将Keys.Decimal(数字键盘“。”)转换为逗号,还是我们的应用程序应该将Keys.Decimal更改为区域性特定的小数点分隔符?我希望.NET能够自动进行此翻译。

保罗·威廉姆斯

Windows WM_KEYDOWN事件生成OnKeyDown事件。WM_KEYDOWN正在向我们的应用程序发送Key.Decimal事件。

同样,OnKeyPress事件是直接从WM_CHAR事件生成的。对于法语-加拿大区域设置(使用加拿大法语键盘),Windows会在用户按下数字键盘十进制键时发送带有句点的WM_CHAR事件。但是,对于带有“比利时(逗号)”输入设置的法语-比利时设置,Windows将发送带有逗号的WM_CHAR事件

因此,这既不是.NET错误,也不是我们应用程序中的错误。区域输入设置会影响Decimal键的行为。

但是,某些应用程序在法语-加拿大设置中的响应会有所不同。例如,Excel和Windows计算器都将Keys.Decimal转换为逗号而不是句点。在这种情况下,这些应用程序可能需要特殊处理。

我们可以向应用程序中添加代码以跟踪十进制键并以不同的方式处理它。例如:

protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.KeyData == Keys.Decimal)
        m_DecimalKey = true;
}

protected override void OnKeyPress(KeyPressEventArgs e)
{
    ...
    if (m_DecimalKey || e.KeyChar == CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator)
    {
        // this is a decimal separator
    }
}

protected virtual void OnKeyUp(KeyEventArgs e)
{
    if (e.KeyData == Keys.Decimal)
        m_DecimalKey = false;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章