2014-01-29 54 views
2

我们有一个.NET 2.0 Windows窗体应用程序,其中包含许多自定义控件。几年前,我们将应用程序全球化,因此用户可以看到适合特定文化的符号和翻译。文化特定处理Windows窗体中的数字小键盘小数点键

法国加拿大客户要求我们更改我们的应用程序处理数字小数点键的方式。当用户按下此键时,我们的数字控件没有做任何事情。

我将我的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自动完成这个翻译。

回答

1

OnKeyDown事件由Windows WM_KEYDOWN事件生成。 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; 
}