[Résolu] Changer le curseur sur une NSTextView

berfisberfis Membre
mai 2013 modifié dans API AppKit #1

Bonjour,


Existe-t-il un moyen de changer le curseur au-dessus d'une NSTextView sans la sous-classer?


J'ai lu la doc sur NSTrackingArea, testé des examples, essayé différentes options et différentes méthodes, mais le curseur reste obstinément le "I-Beam". J'ai lu qu'il s'agissait d'un comportement automatique fourni par AppKit, alors comment l'empêcher?


D'avance merci!


Réponses

  • 'berfis' a écrit:


    Bonjour,



    Existe-t-il un moyen de changer le curseur au-dessus d'une NSTextView sans la sous-classer?



    J'ai lu la doc sur NSTrackingArea, testé des examples, essayé différentes options et différentes méthodes, mais le curseur reste obstinément le "I-Beam". J'ai lu qu'il s'agissait d'un comportement automatique fourni par AppKit, alors comment l'empêcher?



    D'avance merci!




    Impossible sans faire une sous-classe,



    Vu sur le web l'exemple suivant:


    <br />
    - (void)drawInsertionPointInRect:(NSRect)rect color:(NSColor *)color<br />
    turnedOn:(BOOL)flag<br />
    {<br />
        //Block Cursor<br />
        if( flag )<br />
    	    {<br />
    	    NSPoint aPoint=NSMakePoint( rect.origin.x,<br />
    rect.origin.y+rect.size.height/2);<br />
    	    int glyphIndex = [[self layoutManager] glyphIndexForPoint:aPoint<br />
    inTextContainer:[self textContainer]];<br />
    	    NSRect glyphRect = [[self layoutManager]<br />
    boundingRectForGlyphRange:NSMakeRange(glyphIndex, 1)  inTextContainer:[self<br />
    textContainer]];<br />
    	  [color set ];<br />
    	    rect.size.width =rect.size.height/2;<br />
    	    if(glyphRect.size.width &gt; 0 &amp;&amp; glyphRect.size.width &lt;<br />
    rect.size.width) rect.size.width=glyphRect.size.width;<br />
    	    NSRectFillUsingOperation( rect, NSCompositePlusDarker);<br />
    	    }<br />
        else<br />
    	    {<br />
    	    [self setNeedsDisplayInRect:[self visibleRect]<br />
    avoidAdditionalLayout:NO];<br />
    	    }<br />
    }<br />
    




    A tester....
  • Hello Devulder,



    J'ai vu plusieurs de ces exemples, mais ils concernent (il y a toujours eu un flou artistique sur la terminologie, depuis 1984 sans doute) le point d'insertion (blinking caret). Je parlais du curseur (cursor), cette chose qui suit les mouvements de la souris et peut prendre diverses formes (flèche, main, croix).



    Mais je suppose que là  aussi il faut sous-classer, sinon Appkit va m'imposer le curseur en forme de I...
  • mpergandmpergand Membre
    décembre 2012 modifié #4
    Je confirme que c'est le gros bazar !



    [font=arial, helvetica, sans-serif]Essaye dans -(void)windowDidUpdate:(NSNotification *)aNotification[/font]



    [font=arial, helvetica, sans-serif]Cette méthode delegate est appelée pour chaque event généré, tu peux connaitre le type d'event avec:[/font]

    [font=arial, helvetica, sans-serif]int type=[[NSApp currentEvent] type];[/font]



    [font=arial, helvetica, sans-serif]good luck ![/font]
  • berfisberfis Membre
    mai 2013 modifié #5

    Finalement j'ai réussi à  trouver quelque chose qui fonctionne...



    #import "ATTextView.h"

    @implementation ATTextView

    // - (id)initWithFrame:(NSRect)frame
    // {
    self = [super initWithFrame:frame];
    if (self) {
    _trackingArea = [[NSTrackingArea alloc]initWithRect:[self frame] options: (NSTrackingMouseMoved | NSTrackingActiveInKeyWindow) owner:self userInfo:nil];
    [self addTrackingArea:_trackingArea];
    }
    return self;
    }

    // - (void)mouseMoved:(NSEvent *)event
    // {
    if (![self isEditable]) [[NSCursor pointingHandCursor] set];
    else [super mouseMoved:event];
    }

    // - (void)updateTrackingAreas
    // { [super updateTrackingAreas];
    [self removeTrackingArea:_trackingArea];
    _trackingArea = [[NSTrackingArea alloc] initWithRect:[self frame] options: (NSTrackingMouseMoved | NSTrackingActiveInKeyWindow) owner:self userInfo:nil];
    [self addTrackingArea:_trackingArea];
    }
    - (BOOL)acceptsFirstMouse:(NSEvent*)theEvent {
    return YES;
    }

    @end

    Trouver le bon renseignement dans la doc constitue 80% de mon temps de programmation:
    https://developer.apple.com/library/mac ... 0i-CH8-SW1


Connectez-vous ou Inscrivez-vous pour répondre.