マウスの右ボタンのクリックで機能させたい NSButton サブクラスがあります。通常のクリックと同じ種類の動作が必要なため、オーバーロードするだけ-rightMouseDown:
ではうまくいきません (たとえば、ボタンが押された場合、ユーザーはボタンを離すことでキャンセルでき、マウスが離されたときにアクションが送信されます)。 )。
私がこれまでに試したことは、 をオーバーロード-rightMouse{Down,Up,Dragged}
し、マウスの左ボタンのクリックを示すようにイベントを変更してから に送信すること-mouse{Down,Up,Dragged}
です。これは明らかにせいぜいハックであり、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:
が、リリース時にボタンが上がらなかったのです。これは、独自に新しいイベントを取得していたため、マウスの右ボタン イベントから左ボタン イベントをインターセプトして変換できなかったためです。