objective-c – 使用自定义NSView在悬停在NSMenuItem上时更改背
发布时间:2020-12-16 05:05:24 所属栏目:百科 来源:网络整理
导读:这是事情: 我已经创建了一个带有自定义NSView的自定义NSMenuItem. 一切正常,但我不能让NSMenuItem突出显示(=在鼠标悬停时更改背景颜色). 我正在尝试在drawRect方法中执行此操作,如此处发布的其他答案所示. 我究竟做错了什么? NSView子类: @interface cust
这是事情:
我已经创建了一个带有自定义NSView的自定义NSMenuItem. 一切正常,但我不能让NSMenuItem突出显示(=在鼠标悬停时更改背景颜色). 我正在尝试在drawRect方法中执行此操作,如此处发布的其他答案所示. 我究竟做错了什么? NSView子类: @interface customView : NSView @end @implementation customView - (id)initWithFrame:(NSRect)frame { NSRect theRect = NSMakeRect(0,200,30); self = [super initWithFrame:theRect]; if (self) { NSTrackingArea * trackingArea = [[NSTrackingArea alloc] initWithRect:theRect options: (NSTrackingMouseEnteredAndExited | NSTrackingActiveInKeyWindow |NSTrackingActiveAlways) owner:self userInfo:nil]; [self addTrackingArea:trackingArea]; } return self; } #define menuItem ([self enclosingMenuItem]) - (void) drawRect: (NSRect) rect { BOOL isHighlighted = [menuItem isHighlighted]; if (isHighlighted) { //this nslog never happens NSLog(@"it's highlighted"); } - (void)mouseUp:(NSEvent*) event { NSMenuItem* mitem = [self enclosingMenuItem]; NSMenu* m = [mitem menu]; [m cancelTracking]; NSLog(@"you clicked the %ld item",[m indexOfItem: mitem]); } @end NSMenuItem子类: @interface customItem : NSMenuItem{ } -(void)setTheText:(NSString*)theString; @property NSTextField *theLabel; @end #import "customItem.h" #import "customView.h" @implementation customItem @synthesize theLabel; -(id)init{ if (self){ customView *cv = [[customView alloc] init]; theLabel = [[NSTextField alloc] initWithFrame:NSMakeRect(10,8,130,17)]; [theLabel setEditable:NO]; [theLabel setBordered:NO]; NSButton *myButton = [[NSButton alloc] initWithFrame:NSMakeRect(170,7,20,20)]; NSButton *myButton1 = [[NSButton alloc] initWithFrame:NSMakeRect(150,20)]; [myButton setBezelStyle:NSCircularBezelStyle]; [myButton1 setBezelStyle:NSCircularBezelStyle]; [myButton setTitle:@""]; [myButton1 setTitle:@""]; [cv addSubview:myButton]; [cv addSubview:myButton1]; [cv addSubview:theLabel]; [self setView:cv]; [theLabel setStringValue:@"A Value "]; } return self; } -(void)setTheText:(NSString *)theString{ [theLabel setStringValue:theString]; } @end 这是App代表: @interface AppDelegate : NSObject <NSApplicationDelegate>{ NSStatusItem *statusItem; IBOutlet NSMenu *theMenu; } @property (assign) IBOutlet NSWindow *window; @end #import "customItem.h" @implementation AppDelegate - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { } - (void)awakeFromNib{ statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSSquareStatusItemLength]; NSBundle *bundle = [NSBundle mainBundle]; NSImage *statusImage = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"barIcon" ofType:@"png"]]; NSImage *highlightImage = [[NSImage alloc] initWithContentsOfFile:[bundle pathForResource:@"barIcon_H" ofType:@"png"]]; [statusItem setImage:statusImage]; [statusItem setAlternateImage:highlightImage]; [statusItem setMenu:theMenu]; [theMenu removeAllItems]; customItem *mi = [[customItem alloc] init]; [theMenu addItem:mi]; customItem *mi2 = [[customItem alloc] init]; [theMenu addItem:mi2]; } @end 这就是我得到的: 解决方法
无需添加布尔值或其他任何东西,您可以在附加到NSMenuItem的自定义NSView中执行此操作
- (void)drawRect:(NSRect)rect { [super drawRect:rect]; //Handle the hightlight if ([[self enclosingMenuItem] isHighlighted]) { [self.lbl_title setTextColor:[NSColor whiteColor]]; [self.lbl_amount setTextColor:[NSColor colorWithDeviceRed:151.0f/255.0f green:164.0f/255.0f blue:179.0f/255.0f alpha:1.0f]]; [[NSColor selectedMenuItemColor] setFill]; } else { [self.lbl_title setTextColor:[NSColor blackColor]]; [self.lbl_amount setTextColor:[NSColor whiteColor]]; [[self backgroundColor] setFill]; } NSRectFill(rect);} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |