0

我有多个复选框。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 和或 alt 和或 shift 和或键。我什至尝试了一些数组,但不知道如何解决这个问题。

4

2 回答 2

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”语句。条件运算符可能会编译成与您编写“IF”语句完全相同的 IL。但是,在这种情况下,它们更容易阅读。

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

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

于 2014-05-18T12:38:36.717 回答
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 的情况希望我能很好地理解你的问题。

于 2014-05-18T08:50:27.207 回答