如何使用复选框添加修饰键

时间:2014-05-18 00:00:52

标签: c# .net checkbox hotkeys modifiers

我有多个复选框。 CTRL [],ALT [],SHIFT []。如果检查了checkobx,是否可以添加修饰符?

RegisterHotKey(_hWnd, 2, (uint)fsModifiers.None, (uint)LSettings.Key_ON);

我想要实现的目标: 如果选中复选框CTRL [X]和ALT [X]:

RegisterHotKey(_hWnd, 2, (uint)fsModifiers.Control | (uint)fsModifiers.Alt, (uint)Keys.S);

我知道我可以使用7个IF,但这会非常混乱,因为用户将能够检查他是否想要使用ctrl和/或和/或shift和或键。我甚至试过一些数组,但不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

避免使代码不必要地复杂化。就这样做:

RegisterHotKey(_hWnd,
               2,
               (chkCtrl.Checked     ? fsModifiers.Ctrl  : 0)
                | (chkAlt.Checked   ? fsModifiers.Alt   : 0)
                | (chkShift.Checked ? fsModifiers.Shift : 0)
                | (chkWin.Checked   ? fsModifiers.Win   : 0),
               (uint)Keys.S);

其中chkCtrl等是您的复选框控件的名称。

我不知道您为什么要将每个fsModifiers值转换为uint。我已从代码中删除了这些强制转换。如果要确保传递uint值,则只需声明枚举方式:

enum fsModifiers : uint
{
   Alt      = 0x0001,
   Ctrl     = 0x0002,
   Shift    = 0x0004,
   Win      = 0x0008,
   NoRepeat = 0x4000,
};

是的,这样你就可以有效地拥有4" IF"声明。条件运算符可能会编译成完全相同的IL,就好像你已经编写了" IF"声明。但是,在这种情况下,它们更容易阅读。

找到一些用位数组重写这种逻辑的复杂方法,不会有任何真正的性能优势。瓶颈不是计算传递给RegisterHotKey函数的参数的逻辑,它将是对RegisterHotKey函数的实际调用。编译器或JIT编译器无法对此进行优化,您可以P /调用位于系统DLL中的外部函数。这很慢(相对来说,当然;它仍然不是应用程序中的性能问题)。

就个人而言,我认为 会使逻辑变得更加复杂,从而成为可读性(因此维护成本)的成本。使用上面的代码,任何具有基本编程知识的人都可以弄清楚发生了什么。

答案 1 :(得分:0)

如果是多重或问题,您可以尝试以下方法:

Dim Dipswitch as boolean() 'a single array of boolean
If DipSwitch(0) Then DoA
If DipSwitch(1) Then DoB
If DipSwitch(2) Then DoC
If DipSwitch(3) And Not DipSwitch(4) Then DoD

等。标签可以是类似“0011”的东西。对于Dipswitch 3和4的情况 希望我能理解你的问题。