【问题标题】:How to correctly use ProcessCmdKey in a calculator windows form application?如何在计算器窗体应用程序中正确使用 ProcessCmdKey?
【发布时间】:2014-12-26 07:06:32
【问题描述】:

我正在尝试在 C# Windows 窗体应用程序中构建一个普通的计算器。我希望当我按下任何小键盘键时,数字将显示在文本框中,就像在任何标准计算器中一样。

因此,通过研究,我可以通过覆盖 ProcessCmdKey 并将 Form 的 KeyPreview 属性更改为 true 来完成此操作。

问题是:当我完全使用数字键盘时,计算器工作正常。但是,当我结合 鼠标单击 任何数字按钮,然后尝试再次使用数字键盘键时,数字不会显示在 TextBox 中。

我有一个通用的数字按钮点击方法(它会在 0-9 所有按钮点击时触发)

private void number_button_Click(object sender, EventArgs e)
{
    Button button = (Button)sender;
    textBox1.Text = textBox1.Text + "" + button.Text;
}

加法(类似减法、除法、乘法的明智方法)

private void buttonPlusClk_Click(object sender, EventArgs e)
{
    sign = "+";
    operandOne = double.Parse(textBox1.Text);
    textBox1.Text = "";
}

表格

this.KeyPreview = true;

被覆盖的ProcessCmdKey 方法

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.NumPad0 |
        Keys.NumPad1 |
        Keys.NumPad2 |
        Keys.NumPad3 |
        Keys.NumPad4 |
        Keys.NumPad5 |
        Keys.NumPad6 |
        Keys.NumPad7 |
        Keys.NumPad8 |
        Keys.NumPad9))
    {

        // also not sure about the KeyEventArgs(keyData)... is it ok?
        number_button_Click(keyData, new KeyEventArgs(keyData));
        return true;

    }
    else if(keyData == (Keys.Add))
    {
        buttonPlusClk_Click(keyData, new KeyEventArgs(keyData));
        return true;
    }
    // ... and the if conditions for other operators
    return base.ProcessCmdKey(ref msg, keyData);
}

如果您想查看任何其他代码,请询问我。


为了将来参考从GitHub 获取SSCCE 并重新创建问题,请执行此操作

  1. 从键盘小键盘按2
  2. 点击+
  3. 从键盘小键盘按1(您不会在文本框中看到 1)
  4. 点击等于

【问题讨论】:

  • 我试图重建你的问题(使用 Form.KeyDown),但我没有得到你的问题。
  • 那么为什么KeyDown?我重写了ProcessCmdKey 方法。

标签: c# .net winforms


【解决方案1】:

在您的密钥处理函数中试试这个。当它们不用作标志时,XOR'ing 数字是不正确的。
此外,从该函数调用事件处理程序会导致错误,因为第一个 arg 不是按钮。

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            int intKey = (int)keyData;
            if (intKey >= 96 && intKey <= 105) // 96 = 0, 97 = 1, ..., 105 = 9
            {
                textBox1.Text = textBox1.Text + (intKey - 96).ToString();
                return true;

            }
            // ... and the if conditions for other operators
            return base.ProcessCmdKey(ref msg, keyData);
        }

【讨论】:

  • 非常感谢。你能详细说明一下“当它们不用作标志时,XOR'ing 数字是不正确的”
  • 如果你查看'Keys'的二进制表示,你会得到: Keys.NumPad0 => 0110 0000 Keys.NumPad1 => 0110 0001 Keys.NumPad2 => 0110 0010 当你应用 XOR (单个管道)到这些,然后你对这些字节中的每一位进行异或)你最终得到 0110 0011,即 Keys.NumPad3。
  • 对所有小键盘键进行异或运算,得到整数 111,即“除”键。您可以通过Keys result = (Keys.NumPad0 | Keys.NumPad1 | Keys.NumPad2 | Keys.NumPad3 | Keys.NumPad4 | Keys.NumPad5 | Keys.NumPad6 | Keys.NumPad7 | Keys.NumPad8 | Keys.NumPad9); 看到这一点。因此,按除号键将输入您的初始 if。
猜你喜欢
  • 2011-02-26
  • 2011-10-06
  • 2019-06-17
  • 2021-09-10
  • 2016-03-18
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多