2013-07-12 6 views
5

Hier ist das Ding:Hintergrundfarbe ändert auf schweben auf einem NSMenuItem mit benutzerdefinierter NSView

ich einen benutzerdefinierten NSMenuItem mit einem benutzerdefinierten NSView in ihm angelegt haben.

Alles funktioniert gut, außer dass ich nicht die NSMenuItem bekommen kann, um hervorgehoben zu werden (= ändern Sie die Hintergrundfarbe bei mouseover).

Ich versuche es innerhalb der drawRect Methode zu tun, wie in anderen hier geposteten Antworten gezeigt.

Was mache ich falsch?


Die NSView Unterklasse:

@interface customView : NSView 
@end 
@implementation customView 

- (id)initWithFrame:(NSRect)frame 
{ 

    NSRect theRect = NSMakeRect(0, 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 

Die NSMenuItem Unterklasse:
(I Subviews auf der benutzerdefinierten Ansicht hinzufügen hier, damit ich Zugriff auf die Steuerung durch die NSMenuItem Instanz haben kann)

@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, 7, 20, 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 

Und das ist die App Delegierter:

@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 

Dies ist, was ich bekommen:

NSMenuItem Issue Screenschot

Antwort

0

OK Ich glaube, ich wurde es.
Ich habe eine öffentliche Bool-Variable in der NSView Unterklasse hinzugefügt.
Dann verwendet i

-(void)mouseEntered:(NSEvent *)theEvent 

und

-(void)mouseExited:(NSEvent *)theEvent 

die Variable YES oder NO einzustellen. Nachdem die variable Einstellung verwendet i

[self setNeedsDisplay:YES] 

-(void) drawRect: (NSRect) rect 

zu nennen das ist, wie ich es :)

3

Keine Notwendigkeit anderes hinzufügen Booleans oder irgendetwas arbeiten haben, können Sie es tun aus Ihrer custom NSView die an Ihre NSMenuItem

- (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);} 
angeschlossen ist