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);}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
