Coordonnées x,y en temps réel

VeillardVeillard Membre
18:44 modifié dans API AppKit #1
Bonjour tout le monde...

Savez-vous comment on peut afficher des coordonnées x,y en temps réel dans un NSRect en fonction du déplacement de la souris.
Je crois qu'il faut coder la gestion des évènements, à  votre avis ???

Réponses

  • mpergandmpergand Membre
    18:44 modifié #2
    Salut,

    Extrait de NSResponder :
    mouseMoved:

    - (void)mouseMoved:(NSEvent *)theEvent

    Informs the receiver that the mouse has moved specified by theEvent. NSResponder?s implementation simply passes this message to the next responder.

    See Also: setAcceptsMouseMovedEvents: (NSWindow)


    La vue doit être fisrtResponder: mouseMoved problems [SOLVED]
  • VeillardVeillard Membre
    18:44 modifié #3
    Merci mpergand, je vais me pencher sur cet article  :P
  • Eddy58Eddy58 Membre
    18:44 modifié #4
    Cet article apporte en effet un début de réponse, mais ensuite il faut récupérer la position de la souris (locationInWindow:) et la convertir en coordonnées locales (convertPoint:). :)

    <br />-(void)mouseMoved:(NSEvent *)event<br />{<br />   NSPoint posSouris=[self convertPoint:[event locationInWindow] fromView:nil];<br />}<br />
    
  • VeillardVeillard Membre
    18:44 modifié #5
    Bon je déterre ce vieux sujet après m'y être penché dessus...  :)
    Maintenant j'arrive à  avoir la position de ma souris en temps réel dans ma NSView, mais je cherche maintenant à  afficher les coordonnées dans une fenêtre de mon NSDocument et là , ça coince. Je ne peux pas faire de TextField à  partir de ma classe NSView et créer le lien dans IB, je crois que ce n'est pas fait pour ça...
    Quelles sont vos suggestions ? passer par une variable accesseur ?
  • fouffouf Membre
    18:44 modifié #6
    Peut etre une notification (lourd)? Tu peux aussi passer par l'intermediaire du contrlleur pricipal de ton appli.
  • cbrandtcbrandt Membre
    18:44 modifié #7
    un outlet dans IB qui va de ta view vers un textfield, ça devrait marcher...
    quelque chose comme ça:

    <br />-(void)mouseMoved:(NSEvent *)event<br />{<br />&nbsp;  NSPoint posSouris;<br />NSString *string;<br /><br />posSouris = [self convertPoint:[event locationInWindow] fromView:nil];<br />string = NSStringFromPoint (posSouris);<br />   [monTextField setStringValue: string];<br />[monTextField display];<br />}<br />
    
  • VeillardVeillard Membre
    18:44 modifié #8
    J'avais déjà  essayé sauf "[monTextField display]" => rien...

    J'ai peut-être fait une erreur dans IB. ???
    J'ai instancié la classe "Profil" (NSView) après avoir rajouté le NSTextField. J'ai créé le lien dans la fenêtre => OK.
    Par contre, il y a quelque chose que je ne comprends pas : dès que j'ai ajouté un outlet dans ma classe "Profil", une erreur est apparue dans mon nib (voir copie).



    [Fichier joint supprimé par l'administrateur]
  • cbrandtcbrandt Membre
    18:44 modifié #9
    ok, j'ai donc fait un petit projet de test pour jouer avec ça:
    <br />#import &quot;MyView.h&quot;<br /><br />@implementation MyView<br /><br />- (void) awakeFromNib<br />{<br />	[[self window] setAcceptsMouseMovedEvents: YES];<br />}<br /><br />- (id)initWithFrame:(NSRect)frameRect<br />{<br /><br />	if ((self = [super initWithFrame:frameRect]) != nil) {<br />		// Add initialization code here<br />		[[self window] setAcceptsMouseMovedEvents: YES];<br />	}<br />	return self;<br />}<br /><br />- (BOOL)acceptsFirstResponder <br /> { <br />	return YES; <br /> } <br />/*<br />- (BOOL)becomeFirstResponder <br />{ <br />	[[self window] setAcceptsMouseMovedEvents: YES]; <br />	return YES; <br />} <br /><br />- (BOOL)resignFirstResponder <br />{ <br />	[[self window] setAcceptsMouseMovedEvents: NO]; <br />	return YES; <br />} <br />*/<br />- (void)drawRect:(NSRect)rect<br />{<br />	NSRectFill (rect);<br />}<br /><br />-(void)mouseMoved:(NSEvent *)event<br />{<br />	NSPoint posSouris;<br />	NSString *string;<br /><br />	posSouris = [self convertPoint:[event locationInWindow] fromView:nil];<br />	string = NSStringFromPoint (posSouris);<br />//	NSLog (string);<br />	[myTextField setStringValue: string];<br />	[myTextField display];<br />}<br /><br />@end<br />
    

    ça ne marche lorsque la view est firstresponder, c'est-à -dire après qu'on ait cliqué dedans, et ça arrête de fonctionner lorsque on clique dans certains autres types d'objets dans la fenêtre (nstextfield, mais pas nsbutton par ex.).

    à  mon avis, si tu as besoin de connaà®tre les coordonnées à  tout moment quand le pointeur de souris se trouve au-dessus de ta vue, c'est raté... va falloir trouver une autre méthode (j'y travaille...)
  • cbrandtcbrandt Membre
    18:44 modifié #10
    voici la suite...

    si on mets le - (void)mouseMoved:(NSEvent *)theEvent dans une nswindow, ça marche... bon, il faut que la fenêtre ait un outlet vers le nstextfield, et c'est pas très "propre" du point de vue de la séparation des tâches d'après notre maxime à  tous, qui est "model-controller-view" :)

    donc la fenêtre pourrait informer son controller que la souris à  bougé, et le controller a les outlets vers la view, le textfield, etc....

    (voir le projet joint)

    [Fichier joint supprimé par l'administrateur]
  • fouffouf Membre
    18:44 modifié #11
    Sinon dans la vue, on ne peut pas implementer -(void)mouseEntered:(NSEvent *)e et -(void)mouseExited:(NSEvent *)e ?? Une idee comme ca
  • VeillardVeillard Membre
    18:44 modifié #12
    Merci cbrandt  :o je viens de récupérer la doc, je vais potasser ça tout de suite  :brule:
  • VeillardVeillard Membre
    18:44 modifié #13
    Je viens aux nouvelles...

    Ca marche  :brule: :brule: :brule: Merci cbrandt.

    J'ai dû faire un NSWindow et un NSWindowController comme tu as dit, j'ai essayé de remplacer le NSWindow par mon NSDocument mais ça ne marchait pas. En tout cas Coool...
Connectez-vous ou Inscrivez-vous pour répondre.