MouseEntered & Exited dans NSButton

00:20 modifié dans API AppKit #1
à‰tant donné que NSButton descend de NSView (tout comme l'Homme descend du singe), le "mouse tracking" devrait être fonctionnel dans ma sous-classe NSButton.

Hors, malgré l'implémentation de
- (void)mouseEntered:(NSEvent*)theEvent

et
- (void)mouseExited:(NSEvent*)theEvent

Je n'obtiens rien du tout...
En lisant la doc Apple, j'ai rajouté addTrackingRect:owner:userData:assumeInside:
<br />- (id)initWithFrame:(NSRect)frame {<br />&nbsp; &nbsp; self = [super initWithFrame:frame];<br />&nbsp; &nbsp; if (self) {<br />&nbsp; &nbsp; &nbsp; &nbsp;  [self addTrackingRect:frame owner:self userData:nil assumeInside:NO];<br /> }<br />&nbsp; &nbsp; return self;<br />}<br />


Rien n'y fait. (J'ajoute que ma fenêtre accepte bien les mouvements de souris)

Merci d'avance,
Louka.

Réponses

  • AliGatorAliGator Membre, Modérateur
    00:20 modifié #2
    Ouais ceci dit les Tracking Rects... c'est pas très fiable il me semble, non ?
  • BruBru Membre
    00:20 modifié #3
    Il existe une méthode sûre et fiable...
    Mais c'est dans NSButtonCell qu'il faut regarder !

    Sous-classe le buttonCell de ton NSButton.
    Ensuite, il faut autoriser ton buttonCell à  recevoir les mouse-moved-events par :
    [tt][buttonCell setShowsBorderOnlyWhileMouseInside:YES];[/tt]

    Enfin, il ne te reste plus qu'à  implémenter mouseEntered: et mouseExited: dans la sous-classe de NSButtonCell.

    J'utilise cette méthode pour créer un bouton qui ressemble à  un hyperlien.
    Cela permet de modifier le curseur de la souris (en main) dès que le pointeur survole le lien.

    .
  • octobre 2006 modifié #4
    Ma sous-classe NSButton :
    <br />- (id)initWithFrame:(NSRect)frame {<br />    self = [super initWithFrame:frame];<br />    if (self) {<br />		DKButtonCell* cell = [[DKButtonCell alloc] init];<br />		[cell setShowsBorderOnlyWhileMouseInside:YES];<br />		[cell setButtonType:NSToggleButton];<br />		[cell setBordered:NO];<br />		[cell setImagePosition:NSImageOnly];<br />		[self setCell:[cell autorelease]];<br />		<br />		[self setTarget:self];<br />   }<br />    return self;<br />}<br />
    


    Mais ça ne répond pas à  mouseEntered: ni mouseExited:

    J'ajoute que je "dessine" cette sous-classe de NSButton dans une NSView (addSuview:)
  • BruBru Membre
    00:20 modifié #5
    Chez moi, ça marche...
    Alors si chez toi, ça ne marche pas... Tu connais ma réponse !

    Je te joins le bout de code que j'utilise pour les hyperliens :
    <br />@interface HyperLinkCell : NSButtonCell<br />{<br />}<br />@end<br /><br />@implementation HyperLinkCell<br />- (id)initTextCell:(NSString *)aString<br />{<br />&nbsp; &nbsp; self=[super initTextCell:aString];<br />&nbsp; &nbsp; [self setBezelStyle:NSSmallSquareBezelStyle];<br />&nbsp; &nbsp; [self setShowsBorderOnlyWhileMouseInside:YES];<br />&nbsp; &nbsp; [self setGradientType:NSGradientNone];<br />&nbsp; &nbsp; return self;<br />}<br /><br />- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView<br />{<br />&nbsp; &nbsp; NSDictionary *attributs;<br />&nbsp; &nbsp; NSColor *col;<br />&nbsp; &nbsp; NSSize titleSize;<br />&nbsp; &nbsp; NSRect cellRect;<br /><br />&nbsp; &nbsp; // création du NSColor en fonction de l&#39;état highlight du contrôle<br />&nbsp; &nbsp; if ([self isHighlighted]) col=[NSColor purpleColor];<br />&nbsp; &nbsp; else col=[NSColor blueColor];<br /><br />&nbsp; &nbsp; // création du dictionnaire des attributs<br />&nbsp; &nbsp; attributs=[NSDictionary dictionaryWithObjectsAndKeys:<br />&nbsp; &nbsp; &nbsp; &nbsp; [NSNumber numberWithInt:NSUnderlineStyleSingle], NSUnderlineStyleAttributeName,<br />&nbsp; &nbsp; &nbsp; &nbsp; [NSFont systemFontOfSize:0], NSFontAttributeName,<br />&nbsp; &nbsp; &nbsp; &nbsp; col, NSForegroundColorAttributeName, nil];<br /><br />&nbsp; &nbsp; // calcul du rectangle du titre (centré)<br />&nbsp; &nbsp; titleSize=[[self title] sizeWithAttributes:attributs];<br />&nbsp; &nbsp; cellRect.origin.x=(cellFrame.size.width - titleSize.width)/2;<br />&nbsp; &nbsp; cellRect.origin.y=(cellFrame.size.height - titleSize.height)/2;<br />&nbsp; &nbsp; cellRect.size.width=titleSize.width;<br />&nbsp; &nbsp; cellRect.size.height=titleSize.height;<br /><br />&nbsp; &nbsp; // dessin du titre<br />&nbsp; &nbsp; [[self title] drawInRect:cellRect withAttributes:attributs];<br />}<br /><br />- (void)mouseEntered:(NSEvent *)event<br />{<br />&nbsp; &nbsp; // souris dans le contrôle : changement en main<br />&nbsp; &nbsp; [[NSCursor pointingHandCursor] push];<br />}<br /><br />- (void)mouseExited:(NSEvent *)event<br />{<br />&nbsp; &nbsp; // souris hors du contrôle : retour à  la normale<br />&nbsp; &nbsp; [NSCursor pop];<br />}<br />@end<br />
    


    .
  • 00:20 modifié #6
    Je teste ça, mais logiquement je peux zapper les méthodes drawInteriorWith....
Connectez-vous ou Inscrivez-vous pour répondre.