Changer de curseur : problème avec mouseDragged et scrollWheel

Philippe49Philippe49 Membre
04:28 modifié dans API AppKit #1
Changement de curseur avec mouseDown et mouseUp : impeccable
<br />-(void) mouseDown : (NSEvent*) event {<br />	[[NSCursor closedHandCursor] push];<br />}<br />-(void) mouseUp:(NSEvent *) event {<br />	[[NSCursor closedHandCursor] pop];<br />}<br />


Changement de curseur avec mouseEntered et mouseExited : impeccable
<br />-(void) mouseEntered : (NSEvent*) event {<br />	[[NSCursor openHandCursor] push];<br />}<br />-(void) mouseExited : (NSEvent*) event {<br />	[[NSCursor openHandCursor] pop];<br />}


Mais avec mouseDragged ou scrollWheel, le curseur repasse en mode flèche. Elle est où l'astuce ?

Réponses

  • fouffouf Membre
    04:28 modifié #2
    Perso, lorsque j'ai besoin d'utiliser des curseurs, j'utilise les cursor rects qui marchent excellemment bien et ce même avec des drag-and-drop et des scroll.


  • Philippe49Philippe49 Membre
    04:28 modifié #3
    Un schéma de ce type ?

    <br />-(void)resetCursorRects<br />{<br />	[self addCursorRect:self.bounds cursor:currentCursor];	<br />}<br />-(void) mouseDown : (NSEvent*) event {<br />	currentCursor=[NSCursor closedHandCursor];	<br />	[self resetCursorRects];<br />}<br />- (void)mouseDragged:(NSEvent *)event{<br />	....<br />}<br /><br />-(void) mouseUp:(NSEvent *) event {<br />	currentCursor=[NSCursor&nbsp; openHandCursor];<br />	[self resetCursorRects];<br />}<br /><br />
    



    Quel équivalent du mouseUp a-t-on pour scroolWheel? C'est à  dire comment détecter la fin d'un scroll wheel ?
  • fouffouf Membre
    mai 2009 modifié #4
    Presque. Juste à  la place de [self resetCursorRects] , je met [[self window] invalidateCursorRectsForView:self]. Sinon, tu n'enlèveras pas l'ancien cursorRect, et puis de toutes façons, tu n'es pas sensé faire un appel direct à  resetCursorRects (cf doc :
    Application code should never invoke this method directly
    ). A la limite tu peux faire un [[self window] resetCursorRects]  mais ils disent aussi de faire plutôt appel à  invalidateCursorRectsForView:

    Pour le scroll well, tu peux imaginer un truc du type (pour rester dans l'esprit de ton code précédent) :

    <br />- (void)scrollWheel:(NSEvent *)theEvent<br />{<br />&nbsp; &nbsp; &nbsp; currentCursor=[NSCursor closedHandCursor];<br />&nbsp; &nbsp; &nbsp;  [[self window] invalidateCursorRectsForView:self];<br />}<br /><br />- (void)mouseMoved:(NSEvent *)theEvent<br />{<br />&nbsp; &nbsp; &nbsp; currentCursor=[NSCursor openHandCursor];<br />&nbsp; &nbsp; &nbsp;  [[self window] invalidateCursorRectsForView:self];<br />}<br />
    

    Mais il faut que j'avoue trouver assez lourd l'appel répété à  invalidateCursorRectsForView: dans le mouseMoved: . Je mettrais alors un test (ou, ce que je trouve encore plus propre, un booléen que l'on met à  YES ou NO selon que l'on ait besoin ou non de la main fermée) :
    <br />- (void)scrollWheel:(NSEvent *)theEvent<br />{<br />&nbsp; &nbsp; &nbsp; if(currentCursor != [NSCursor closedHandCursor]){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentCursor=[NSCursor closedHandCursor];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [[self window] invalidateCursorRectsForView:self];<br />&nbsp; &nbsp; &nbsp; }<br />}<br /><br />- (void)mouseMoved:(NSEvent *)theEvent<br />{<br />&nbsp; &nbsp; &nbsp;  if(currentCursor != [NSCursor openHandCursor]){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  currentCursor=[NSCursor openHandCursor];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  [[self window] invalidateCursorRectsForView:self];<br />&nbsp; &nbsp; &nbsp; }<br />}<br />
    


    Il faut juste que tu vérifies que le test fonctionne bien (il se peut que [NSCursor openHandCursor] ne soit pas un singleton auquel cas le test ne fonctionnera pas et tu seras alors obligé de repasser pas le booléen dont j'ai parlé plus haut)
  • Philippe49Philippe49 Membre
    04:28 modifié #5
    Merci !
  • Philippe49Philippe49 Membre
    04:28 modifié #6
    dans 1241338032:

    Il faut juste que tu vérifies que le test fonctionne bien (il se peut que [NSCursor openHandCursor] ne soit pas un singleton auquel cas le test ne fonctionnera pas et tu seras alors obligé de repasser pas le booléen dont j'ai parlé plus haut)

    Bien vu ! Comme ce n'est pas un singleton, je passe par un booléen.
Connectez-vous ou Inscrivez-vous pour répondre.