Ody*_*dys 13 c# enums winforms
我在System.Windows.Forms命名空间中找到了这个gem(IMO).我正在努力弄清楚为什么会这样设置.
[Flags]
public enum MouseButtons
{
None = 0,
Left = 1048576,
Right = 2097152,
Middle = 4194304,
XButton1 = 8388608,
XButton2 = 16777216,
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么它使用这些值(功率2^20来2^24),而不是这样的:
public enum MouseButtons
{
None = 0,
Left = 1, // 2^0
Right = 2, // 2^1
Middle = 4, // 2^2
XButton1 = 8, // 2^3
XButton2 = 16, // 2^4
}
Run Code Online (Sandbox Code Playgroud)
第一个值是100000000000000000000二进制,剩下20位的空间!为什么我们需要这样的空间,为什么它会像这样保存?
Winforms 中使用的枚举值确实倾向于与 winapi 中的相应位匹配,但鼠标按钮的情况并非如此。解释这一点需要相当疯狂的猜测。
我确实有一个,在不依赖 Windows 消息的情况下检索鼠标按钮状态的方式非常奇怪。您调用 GetAsyncKeyState(),通过 VK_XBUTTON2 传递 VK_LBUTTON。假虚拟键实际上代表鼠标键而不是键盘键。这件事发生得太久了,我无法猜测他们为什么这样做,而不是提供适当的 GetMouseButtonState() winapi 函数。
Keys 枚举也具有这些值,例如 Keys.LButton 等。Keys 的另一个特别之处是它还可以对修饰键的状态进行编码。例如,有 Keys.Control 和 Keys.ControlKey。还有 Keys.Shift 与 Keys.ShiftKey 等。第一个表示按键的状态,第二个表示实际的按键。它允许像 keydata == (Keys.Control | Keys.F) 这样的友好代码来检查是否按下了 Ctrl+F。
这些 MouseButtons 枚举值的重要性在于它们适合 Keys 枚举值以指示鼠标按钮的状态。留下 20 位可用于对密钥进行编码的位。
听起来不错,不是吗?唯一的问题是它在 Winforms 对象模型中永远不会以这种方式组合。但可以在您自己的代码中定义也使用鼠标状态的快捷方式。
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |