我有一个 NSButton 子类,我想用鼠标右键单击它。只是重载-rightMouseDown:
不会削减它,因为我想要与常规点击相同的行为(例如,按下按钮,用户可以通过离开按钮取消,释放鼠标时发送动作等。 )。
到目前为止,我尝试的是重载-rightMouse{Down,Up,Dragged}
,更改事件以指示鼠标左键单击,然后将其发送到-mouse{Down,Up,Dragged}
. 现在这显然充其量只是一个 hack,而且事实证明 Mac OS X 并不喜欢这一切。我可以单击按钮,但释放后,按钮仍处于按下状态。
我可以自己模仿这种行为,这不应该太复杂。但是,我不知道如何使按钮看起来被按下。
在您说“不要!这是一种非常规的 Mac OS X 行为,应该避免”之前:我已经考虑过这一点,右键单击可以极大地改善工作流程。基本上按钮循环通过4个状态,我想右键单击使其反向循环。这不是一个必不可少的功能,但它会很好。如果您仍然想说“不要!”,请告诉我您的想法。我很感激!
谢谢!
编辑:这是我改变事件的尝试(你不能改变类型,所以我做了一个新的,复制所有信息。我的意思是,我知道这是框架清楚地告诉我不要这样做,但是我试了一下,就像你一样):
// I've contracted all three for brevity
- (void)rightMouse{Down,Up,Dragging}:(NSEvent *)theEvent {
NSEvent *event = [NSEvent mouseEventWithType:NSLeftMouse{Down,Up,Dragging} location:[theEvent locationInWindow] modifierFlags:[theEvent modifierFlags] timestamp:[theEvent timestamp] windowNumber:[theEvent windowNumber] context:[theEvent context] eventNumber:[theEvent eventNumber] clickCount:[theEvent clickCount] pressure:[theEvent pressure]];
[self mouse{Down,Up,Dragging}:event];
}
更新:我注意到它-mouseUp:
从未发送到 NSButton,如果我将其更改为 NSControl,它就是。我无法弄清楚为什么会这样,直到 Francis McGrew 指出它包含自己的事件处理循环。现在,这也解释了为什么在我可以重新路由之前-rightMouseDown:
,但按钮不会在释放时上升。这是因为它自己获取新事件,我无法拦截并从鼠标右键事件转换为鼠标左键事件。