[ Debutant ] Recuperer des evenements simples sur une NSWindow

mikaelomikaelo Membre
janvier 2013 modifié dans API AppKit #1
[font=arial, helvetica, sans-serif]Bonjour tout le monde,



Comme pas mal de personne ici je debute sous cocoa/MAC/ios, donc si mon post n'est pas au bon endroit, je m'en excuse. J'ai cherché un sujet ressemblant mais sans succès.

En deux mots , je cherche a faire un truc super simple: lancer une fenetre vide et imprimer sur la console l'evenement du passage de souris et des touches clavier. Plutot que d'ecrire des tonnes , voici mon code:



<br />
// dans appDelegate.h[/color]<br />
[color=#5A5A5A]#import &lt;Cocoa/Cocoa.h&gt;[/color]<br />
[color=#5A5A5A]@class CWindow;<br />
@interface AppDelegate : NSObject &lt;NSApplicationDelegate&gt;[/color]<br />
[color=#5A5A5A]@property (assign) IBOutlet CWindow *window;[/color]<br />
[color=#5A5A5A]@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;<br />
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;<br />
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;[/color]<br />
[color=#5A5A5A]- (IBAction)saveAction:(id)sender;[/color]<br />
[color=#5A5A5A]@end[/color]<br />
<br />
[color=#5A5A5A]




<br />
//Dans appDelegate.m<br />
#import &quot;AppDelegate.h&quot;<br />
#import &quot;CWindow.h&quot;[/color]<br />
[color=#5A5A5A]@implementation AppDelegate[/color]<br />
[color=#5A5A5A]@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;<br />
@synthesize managedObjectModel = _managedObjectModel;<br />
@synthesize managedObjectContext = _managedObjectContext;[/color]<br />
[color=#5A5A5A]@synthesize window;[/color]<br />
[color=#5A5A5A]- (void)applicationDidFinishLaunching:(NSNotification *)aNotification<br />
{<br />
	// Insert code here to initialize your application<br />
	[window setTitle:@&quot;Test sur la windows&quot;];<br />
	[window setAcceptsMouseMovedEvents:YES];<br />
	//[aNotification get]<br />
}[/color]<br />
[color=#5A5A5A]// suite du template<br />




<br />
// CWindow.h[/color]<br />
<br />
[color=#5A5A5A]#import &lt;Cocoa/Cocoa.h&gt;[/color]<br />
[color=#5A5A5A]@interface CWindow : NSWindow<br />
- (void)keyDown:(NSEvent *)event;[/color]<br />
[color=#5A5A5A]@end[/color]<br />
<br />
[color=#5A5A5A]




[/color]<br />
[color=#5A5A5A]#import &quot;CWindow.h&quot;[/color]<br />
[color=#5A5A5A]@implementation CWindow[/color]<br />
[color=#5A5A5A]- (void)keyDown:(NSEvent *)event<br />
{<br />
	NSLog(@&quot;Received message keyDown&quot;);<br />
  <br />
	[super keyDown:event];<br />
}[/color]<br />
[color=#5A5A5A]- (void)mouseMoved:(NSEvent *)theEvent<br />
{<br />
	NSLog(@&quot;Received message mouseMoved&quot;);<br />
  <br />
	[super mouseMoved:theEvent];<br />
}[/color]<br />
[color=#5A5A5A]- (void)mouseDown:(NSEvent *)theEvent<br />
{<br />
	NSLog(@&quot;Received message mouseDown&quot;);<br />
  <br />
	[super mouseDown:theEvent];<br />
}[/color]<br />
<br />
[color=#5A5A5A]- (void)sendEvent:(NSEvent *)event<br />
{<br />
	NSLog(@&quot;Received message %s&quot;,   __FUNCTION__);[/color]<br />
[color=#5A5A5A]	[super sendEvent:event];<br />
}<br />
@end[/color]<br />
<br />
[color=#5A5A5A]




Chez moi rien ne se passe. La fenetre s'affiche avec le bon titre mais rien de plus...

PS: Ne me repondez pas avec le lien de la doc apple, je suis deja en train de la bouffer ...[/font]



[font=arial, helvetica, sans-serif]Merci d'avance.[/font]
Mots clés:

Réponses

  • Rien ne s'affiche sur la console ?

    Et la fenêtre est bien définie de classe CWindow dans le fichier NIB ?
  • euuhh,

    Je suis en fichier xib ( nouvelle version de xCode).

    Ensuite dans l'interface graphique de xcode je vois la fenetre dans le fichier xib mais je n'arrive pas a voir de quel type est elle ( NSWindow ou mon type CWindow).
  • pardon , a priori la fenetre est bien reconnue comme IBOutlet window de type CWindow ...
  • J'ai attache le projet ici pour plus d'info.



    Merci

    Mikael
  • Il faut sélectionner la fenêtre, puis l'inspecteur d'identité et changer la classe de la fenêtre. Elle est NSWindow. J'ai changé en CWindow et ça marche.



    Petite remarque. Ce n'est pas une bonne pratique d'attraper les événements avec une fenêtre. Ta fenêtre contient une ContentView, c'est plutôt le boulot d'une vue de capturer les événements.
  • Merci , je vais tester cela. (la, je suis dans le bus ...).
  • Merci cela marche bien ... Je vais regarder du cote de NSView.
  • CéroceCéroce Membre, Modérateur
    NSView comme NSWindow (et NSWindowController et NSViewController) hérite de NSResponder. C'est NSResponder qui implémente les méthodes de gestion d'événements. Il suffit donc de couper-coller le code de gestion d'événements dans une sous-classe de NSView.



    NSWindow n'a pas vocation à  afficher des données. C'est pourquoi JPImbert te conseille d'utiliser une NSView qui pourra changer l'affichage dans sa méthode -drawRect: en réponse à  un événement.
  • Exellent, c'est ce que je viens de comprendre et ca marche bien aussi pour NSView.

    Merci pour vos explications.
Connectez-vous ou Inscrivez-vous pour répondre.