我有多个复选框。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和或键。我甚至尝试了一些数组,但不知道如何解决这个问题
避免使代码变得不必要的复杂。就像这样做:
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
值转换为int。我已经从我的代码中删除了这些强制转换。如果要确保传递的是一个int值,那么只需这样声明枚举:
enum fsModifiers : uint
{
Alt = 0x0001,
Ctrl = 0x0002,
Shift = 0x0004,
Win = 0x0008,
NoRepeat = 0x4000,
};
是的,这样你就有了4个"IF"语句。条件运算符可能会编译成与编写"if"语句完全相同的IL。但是,在这种情况下,它们更容易阅读。
找一些复杂的方法用位数组重写这个逻辑不会有任何真正的性能优势。瓶颈将不是计算传递给RegisterHotKey
函数的参数的逻辑,它将是对RegisterHotKey
函数的实际调用。编译器或JIT编译器都无法对其进行优化,因为您正在调用位于系统DLL中的外部函数。这是缓慢的(当然,相对而言;这仍然不是应用程序的性能问题)。
并且我个人认为,将使逻辑更加复杂,从而降低可读性(以及维护)成本。使用上面的代码,任何具有基本编程知识的人都可以弄清楚发生了什么。
如果是倍数或问题,您可以尝试以下操作:
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"这样的东西。对于开关3和4的情况希望我很好地理解了你的问题。