2009-08-02 7 views
1

J'essaie d'implémenter un sélecteur de couleurs dans mon application Cocoa. (Oui, je connais NSColorPanel Je ne l'aime pas beaucoup Le point de rouler le mien est que je pense que je peux faire mieux.)La sous-classe NSColorWell ne reçoit pas les événements mouseMoved

Voici une photo de l'état actuel de mon sélecteur.

Custom viewness! http://ryanballantyne.name/forumstuff/color-picker-shot.jpg

Les puits entourant la roue de couleurs sont des sous-classes NSColorWell. Ils sont instanciés par programme et ajoutés à la vue roue de couleurs (une sous-classe NSView) en appelant addSubView sur la classe de roue de couleurs.

Je veux faire en sorte que vous puissiez faire glisser les puits de couleur autour de leurs poignées de maintien. Le début de ce voyage fait passer le curseur à une main ouverte lorsque la souris survole les poignées. Malheureusement, I can't use a cursor rect for this because most of my views are rotated. Je dois donc utiliser les événements mouseMoved et faire la détection des hits moi-même.

est ici le code d'événement de souris Je suis en train de faire le travail:

- (void)mouseMoved:(NSEvent*)event 
{ 
    NSLog(@"I am over here!\n"); 

    [super mouseMoved:event]; 

    NSPoint eventPoint = [self convertPoint:[event locationInWindow] fromView:nil]; 
    BOOL isInHandle = [grabHandle containsPoint:eventPoint]; 
    if (isInHandle && [NSCursor currentCursor] != [NSCursor openHandCursor]) { 
     [[NSCursor openHandCursor] push]; 
    } 
    else if (!isInHandle) [NSCursor pop]; 
} 

- (void)mouseEntered:(NSEvent*)event 
{ 
    [[self window] setAcceptsMouseMovedEvents:YES]; 
} 
- (void)mouseExited:(NSEvent*)event 
{ 
    [[self window] setAcceptsMouseMovedEvents:NO]; 
    [NSCursor pop]; 
} 

- (BOOL)acceptsFirstResponder 
{ 
    return YES; 
} 
- (BOOL)resignFirstResponder 
{ 
    return YES; 
} 

Je trouve que ma méthode mouseMoved est jamais appelé. Idem pour entrée et sortie. Cependant, quand j'implémente mouseDown, celui est appelé, donc au moins quelques événements m'arrivent, mais pas ceux que je veux.

Des idées? Merci!

+0

Ensuite, non seulement votre sélecteur s'ajoute au panneau de couleurs existant au lieu de jeter ses fonctionnalités, mais vous pouvez même l'exporter en tant que plug-in afin que l'utilisateur puisse utiliser votre sélecteur de couleurs dans n'importe quelle application. –

+0

J'ai pensé à le faire dans les prochaines versions. D'abord, je dois me prouver que mon idée d'un meilleur sélecteur de couleurs va se développer. –

Répondre

2

mouseEntered: et mouseExited: ne suit pas l'entrée/la sortie directe de votre vue; ils suivent l'entrée/la sortie des zones de suivi que vous avez définies dans votre vue. Les méthodes pertinentes sont -addTrackingRect:owner:userData:assumeInside: et -removeTrackingRect:. Passez simplement le [self bounds] pour le premier paramètre si vous voulez que votre vue entière soit suivie. Si votre application est 10.5+ seulement, vous devriez probablement utiliser NSTrackingArea à la place car elle prend en charge directement les événements déplacés par la souris uniquement dans la zone de suivi. Gardez à l'esprit que 1) les suivis de suivi ont le même comportement quelque peu étrange que le curseur reclage w/r/t, et 2) si vos limites changent (pas simplement votre cadre), vous devrez probablement établissez votre rectangle de suivi, donc sauvegardez le tag rectangle de suivi pour l'enlever plus tard. Pourquoi ne pas créer une sous-classe NSColorPicker?

+0

Merci pour l'astuce à propos de NSTrackingArea; Je vais certainement vérifier cela. –

Questions connexes