code simple pour récuper évènement souris

prepa75prepa75 Membre
14:31 modifié dans API AppKit #1
Bonsoir à  tous,

aprés avoir fouiné sur tout le forum mais sans succés, je recherche un code simple pour récupérer un évènement de la souris.


voici un essai non concluant qui est censé me dire lorsque je clique avec la souris. Pouvez vous me dire d'ou vient le problème ?
j'ai essayer de me servir du chapitre 18 de Hillegass mais je ne comprend pas d'ou vient le problème.

dans IB, j'ai créer une NSView a l'intérieur de la NSWindow d'origine.

mon .m
#import &quot;testViewAppDelegate.h&quot;<br /><br />@implementation testViewAppDelegate<br /><br />@synthesize window;<br /><br />- (void)awakeFromNib<br />{<br />[window setAcceptsMouseMovedEvents:YES];&nbsp; &nbsp; //j&#39;ai essayer d&#39;intervertir les trois mais sans succes...<br />[[window contentView] addSubview:view];<br />[window makeFirstResponder:view];<br /><br />}<br /><br />- (void)mouseDown:(NSEvent *)theEvent<br />{<br />	NSLog(@&quot;mouseDown&quot;);<br />}<br /><br />@end<br />


mon .h
#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface testViewAppDelegate : NSObject &lt;NSApplicationDelegate&gt; {<br />&nbsp; &nbsp; NSWindow *window;<br />	<br />	IBOutlet NSView *view;<br />}<br /><br />@property (assign) IBOutlet NSWindow *window;<br /><br />@end<br />

Réponses

  • mpergandmpergand Membre
    14:31 modifié #2
    Salut,

    Si je comprends bien, tu attends que mouseDown: soit appelé sur un NSObject !

    Tu vas pouvoir attendre longtemps  :D
  • prepa75prepa75 Membre
    14:31 modifié #3
    Ah oui il faut que ma classe testViewAppDelegate soit de type NSView c'est bien ça ??
  • mpergandmpergand Membre
    14:31 modifié #4
    Oui, bien sûr, il te faut sous classer NSView.

    Que veux-tu faire exactement ?
  • prepa75prepa75 Membre
    14:31 modifié #5
    en fait je veux faire une simple window qui lorsque l'on clique dedans le log me dise "bravo tu as réussi" c'est totalement inutile mais c'est juste pour comprendre le principe, car je ne suis pas du tout à  l'aise avec les NSEvent  :(
  • mpergandmpergand Membre
    14:31 modifié #6
    Tu crées une sous classe de NSView ex: "MyView"
    Dans IB, tu ajoutes une NSView à  la fenêtre  et tu la changes en MyView

    Dans MyView, tu implémentes mouseDown:

    Et voilà  !

  • AliGatorAliGator Membre, Modérateur
    14:31 modifié #7
    En effet seuls les objets dérivant de NSResponder (dont NSView hérite) implementent mouseDown: & co : mouseDown, mouseMoved etc sont des méthodes de la classe NSResponder, et le principe est tout simplement que si tu veux y mettre du code bah tu sous-classes pour surcharger ces méthodes... Encore faut-il sous classer une classe dérivant de NSResponder (typiquement on sous-classe NSView en effet) !
  • prepa75prepa75 Membre
    14:31 modifié #8
    Ok merci pour vos lumières, je vais approfindir ça ! en ce moment je bidouille l'Obj-C pour essayer de comprendre la POO, mais je vais attendre d'ici quelques mois pour l'aborder en cour ! On fera du Java au 2eme semestre Je pense que je pourrai faire un rapprochement direct avec l'obj-C 
  • prepa75prepa75 Membre
    14:31 modifié #9
    Bon voilà  le petit code d'une facilité déroutante qui paye pas de mine mais qui marche comme je veux (pour ce qui se pose la question...) c'est à  termes pouvoir faire un calcul juste en cliquant dans une NSView.

    test_mouseAppDelegate.h :

    #import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface test_mouseAppDelegate : NSView<br /> {<br />&nbsp;  IBOutlet NSView *view1;<br />}<br /><br />@end<br />
    


    test_mouseAppDelegate.m
    #import &quot;test_mouseAppDelegate.h&quot;<br /><br />@implementation test_mouseAppDelegate<br /><br />-(void)mouseDown:(NSEvent *)event<br />{<br />	NSLog(@&quot;view 1&#092;n&quot;);<br />}<br />@end
    


  • prepa75prepa75 Membre
    14:31 modifié #11
    Re-bonsoir, dans la suite de mon apprentissage je me heurte a un nouveau problème  : je souhaite récupérer un énènement lorsque je clique dans un NSTextfield. Je m'explique :

    je possède 3 NSTextfield dans une NSWindow et j'ai besoin de savoir quel Textfield est le FirstResponder (celui qui est entouré  d'un halo bleu) lors d'un click de souris.

    Vous pensez que c'est faisable ? parsque j'ai beau étudier les méthodes de NSResponder, NSWindow et NSTextField je ne trouve pas.
    il y a juste la méthode -first responder qui est dans NSWindow qui peut parraitre interessante mais je n'arrive pas a l'utiliser correctement.
  • prepa75prepa75 Membre
    14:31 modifié #13
    Merci bien, Je vais feuilleter tout cela 
  • mpergandmpergand Membre
    14:31 modifié #14
    Pour connaà®tre le firstResponder:
    - (NSResponder *)firstResponder (NSWindow)

    Pour forcer un control à  devenir firstResponder:
    - (BOOL)makeFirstResponder:(NSResponder *)aResponder (NSWindow)

    Pour des TextFields  la méthode déléguée la plus utilisée est :
    - (void)controlTextDidEndEditing:(NSNotification *)aNotification

    C'est grâce à  cette méthode que l'on met à  jour le "Model" de l'application.

    Il est parfois utile de forcer un "end editing" pour un TextField, pour cela on peut utiliser:
    - (BOOL)makeFirstResponder:(NSResponder *)aResponder (NSWindow)
    avec nil comme paramètre.
  • laudemalaudema Membre
    novembre 2010 modifié #15
    dans 1288729897:

    je souhaite récupérer un énènement lorsque je clique dans un NSTextfield. Je m'explique :

    je possède 3 NSTextfield dans une NSWindow et j'ai besoin de savoir quel Textfield est le FirstResponder (celui qui est entouré  d'un halo bleu) lors d'un click de souris.

    Pour savoir lequel est entouré d'un halo bleu il faut implémenter dans le delegate du TextField la méthode controlTextDidBeginEditing.

    <br />- (void)controlTextDidBeginEditing:(NSNotification *)aNotification{<br />&nbsp; &nbsp;  NSControl * leTextFieldAvecUnHalo = [aNotification object];<br />}<br />
    

    La chose que j'ai eu du mal à  comprendre avec les NSTextFields c'est qu'ils sont surtout Fields et très peu Text. Gérer le texte est un gros travail, les textFields peuvent être nombreux et ça occuperait beaucoup de mémoire si chacun devait embarquer les capacités d'édition de texte.
    Cocoa utilise un objet, une NSTextView spécialisée pour interpréter les touches tabulation | entrée | retour chariot, qu'il appelle le Field Editor possédé par la NSWindow. À chaque fois qu'un NSTextField récupère le focus la fenêtre vient plaquer dessus ce Field Editor avec le texte du contrôle dedans et c'est lui qui reçoit les événements tant qu'on est dans le champ.

    Cet objet est accessible dans les méthodes déléguées du NSTextField, il est dans le dictionnaire userInfo de la notification avec la clef @NSFieldEditor
  • prepa75prepa75 Membre
    14:31 modifié #16
    Nikel merci, je vous tiens au courant des que j'aurai testé 
Connectez-vous ou Inscrivez-vous pour répondre.