我想了解如何按住鼠标按钮时Cocoa的鼠标消息分派工作。了解NSView/NSWindow鼠标捕获和发送
我的背景是在Windows的编程所以这次我来自的角度...
- 窗口发送鼠标按下事件
- 应用程序可以调用SetCapture(HWND),要求今后所有的鼠标事件鼠标
- 的应用下得到传递到窗口,而不是窗口做恢复正常小鼠调度时调用ReleaseCapture
- 的应用程序可能会收到该指令它释放捕获并取消所有追踪模式的WM_CANCELMODE消息。 (例如:远离窗户的鼠标拖拽操作期间发送这个,如果你使用Alt-Tab)
所以我的学习围绕可可,我明白了事情是这样的方式......
- NSWindow /的NSView收到NSLeftMouseDown事件
- 可可自动“捕获”鼠标并发送NSLeftMouseDragged事件,同时鼠标按钮被保持到被单击的窗口/视图。
- NSWindow /接收的NSView事件NSLeftMouseUp
这里是我的问题:
- 是否有一个窗口中取消捕捉的老鼠,并明确将其重新捕捉到另一个窗口的方法吗?
- 有没有办法找出哪个窗口(和/或视图)当前有鼠标“捕获”?
- 是否有任何情况下视图可能会收到不平衡的mouseDown/Up事件?
- 是否有像WM_CANCELMODE这样的事件,我应该注意取消当前的跟踪操作?
要解释什么是我想要实现的,我有我的应用程序滑块控件:
上按下鼠标显示了在一个弹出窗口放大版本:
当弹出的鼠标光标被自动移动到较大的滑块的把手,直到它释放跟踪鼠标之后将弹出被删除,光标移回到较小的滑块。 (Here's a video显示它)
我需要将捕获的鼠标事件重定向到弹出的NSWindow,或者在我的鼠标跟踪循环中已知NSWindow当前捕获鼠标。我可以通过跟踪鼠标事件来解决这个问题,但认为可能有API来获取它(例如:像Window的GetCapture()API)。
btw:我实际上有这个工作,但是我做的感觉有点冒失,我想更好地理解OSX的方法 - 只要确保我没有漏掉任何明显/更容易的东西。
滑块是'NSlider'还是自定义控件? – Willeke
它必须是一个自定义控件来处理鼠标事件,对吗? –
其实让我想到了一个我从未意识到的问题,AppKit控件是否有自己的'-mouseDown'实现?所以就像是如果你划分了'NSSlider',覆盖'-mouseDown',你能不小心移除滑块的原始功能(移动旋钮?) –