ポップアップメニューを実装しようとしています(Chromeでカーソルが左矢印の上にあるときにマウスの右ボタンを押すと表示されるもの)。
から派生したクラスがあり、からNSToolBarItem
派生した別のクラスがありNSToolBar
ます。ツールバーでsetAllowsUserCustomization
. そのため、ツールバーの任意の場所を右クリックすると、ツールバーのカスタマイズ メニューが表示されます。
あなたが与えることができる任意のポインタをありがとう.
ポップアップメニューを実装しようとしています(Chromeでカーソルが左矢印の上にあるときにマウスの右ボタンを押すと表示されるもの)。
から派生したクラスがあり、からNSToolBarItem
派生した別のクラスがありNSToolBar
ます。ツールバーでsetAllowsUserCustomization
. そのため、ツールバーの任意の場所を右クリックすると、ツールバーのカスタマイズ メニューが表示されます。
あなたが与えることができる任意のポインタをありがとう.
サブクラス化する必要はありませんNSToolbarItem
。1 つのツールバー項目に独自のビューを(コードまたは IB で) 与えるだけです。そのビューでは、 のような標準コントロールNSPopUpButton
、または任意のイベント処理ロジックを備えたカスタム ビューを使用できます。
NSToolbarItem カスタム ビューで mouseDown イベントを受信する場合は、次のパターンに従うことができます: カスタム NSWindow サブクラスを使用 (または-[NSWindow hitTest:]
メソッドをスウィズル) し、イベントを自分でビューに転送します。
// MyWindow.h
@interface MyWindow : NSWindow
@end
@interface NSView (MyWindow)
- (BOOL)interceptsToolbarRightMouseDownEvents;
@end
// MyWindow.m
@implementation NSView (MyWindow)
- (BOOL)interceptsToolbarRightMouseDownEvents { // overload in your custom toolbar item view return YES
return NO;
}
@end
@interface NSToolbarView : NSView /* this class is hidden in AppKit */ @end
@implementation MyWindow
- (void)sendEvent:(NSEvent*)event {
if (event.type == NSRightMouseDown) {
NSView* frameView = [self.contentView superview];
NSView* view = [frameView hitTest:[frameView convertPoint:event.locationInWindow fromView:nil]];
if ([view isKindOfClass:NSToolbarView.class])
for (NSView* subview in view.subviews) {
NSView* view = [subview hitTest:[subview convertPoint:event.locationInWindow fromView:nil]];
if (view.interceptsToolbarRightMouseDownEvents)
return [view rightMouseDown:event];
}
}
[super sendEvent:event];
}
@end