Passer au travers d'une childWindow

UniXUniX Membre
00:44 modifié dans API AppKit #1
Salut.

J'ai une childWindow "accrochée" à  une fenêtre.
Je souhaiterais que lorsque je clique par dessus la childWindow, le clic s'applique à  la window qui est en dessous (sa parentWindow), et non à  la childWindow.

J'ai essayé de faire un truc dans le style :
- (void)mouseDown:(NSEvent *)event<br />{<br />	[[self parentWindow]mouseDown:event];<br />}<br /><br />- (void)mouseDragged:(NSEvent *)event<br />{<br />	[[self parentWindow]mouseDragged:event];<br />}<br /><br />- (void)mouseUp:(NSEvent *)event<br />{<br />	[[self parentWindow]mouseUp:event];<br />}


... mais c'est pas terrible ...!

Comment dois-je m'y prendre ?

Réponses

  • AntilogAntilog Membre
    00:44 modifié #2
    As-tu essayé d'implémenter, pour ta childWindow
    acceptsFirstResponder
    
    en retournant NO?
  • UniXUniX Membre
    00:44 modifié #3
    Oui. Mais c'est pas mieux.
    Normal la doc dit :
    Objects that aren?t first responder can receive mouse-down messages, but no other event or action messages
    


    J'ai aussi essayé canBecomeKeyWindow et canBecomeMainWindow, mais sans plus de résultat.
  • AliGatorAliGator Membre, Modérateur
    00:44 modifié #4
    Essaye donc :
        [taChildWindow setIgnoresMouseEvents:YES];
    

    Il me semble que c'est ce que j'avais utilisé (pour une fenêtre semi-transparente qui devait "laisser passer les clics à  travers", dans mon cas)

    A faire je pense de préférence avant le [mainWin addChild:taChildWindow], quoique ça ne doit pas avoir d'importance (mais c'est plus logique)
  • BruBru Membre
    00:44 modifié #5
    dans 1160868475:

    J'ai essayé de faire un truc dans le style :
    - (void)mouseDown:(NSEvent *)event<br />{<br />	[[self parentWindow]mouseDown:event];<br />}<br /><br />- (void)mouseDragged:(NSEvent *)event<br />{<br />	[[self parentWindow]mouseDragged:event];<br />}<br /><br />- (void)mouseUp:(NSEvent *)event<br />{<br />	[[self parentWindow]mouseUp:event];<br />}
    



    Ca ne peut pas marcher. Un NSEvent est attaché à  une fenêtre, il ne peut donc pas ensuite être renvoyé à  une autre sans transformation. Notamment, il faut modifier le locationInWindow pour transformer les coords de la child vers son parent.

    Je te conseille plutôt de faire ceci : créé une sous-classe NSWindow et réimplémente la méthode sendEvent:. Cette sous-classe sera celle de la child-window.

    Le but du code est de créer un nouvel event de type mouseDown qui sera attaché à  la fenêtre parente (via le paramètre windowNumber). Il faut aussi transformer les coords d'une fenêtre vers l'autre. Enfin, on envoie cet event à  l'appli pour que la fenêtre parente le reçoit :

    <br />@implementation PersoWindow<br /><br />- (void)sendEvent:(NSEvent *)theEvent<br />{<br />&nbsp; &nbsp; NSEvent *mouseEvent;<br />&nbsp; &nbsp; NSPoint point;<br /><br />&nbsp; &nbsp; // event reçu est un clic : on l&#39;attrape<br />&nbsp; &nbsp; if ([theEvent type]==NSLeftMouseDown)<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; // transformation du locationInWindow en coords globales (celles de l&#39;écran)<br />&nbsp; &nbsp; &nbsp; &nbsp; point=[self convertBaseToScreen:[theEvent locationInWindow]];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; // transformation du point coords globales en coords spécifiques à  parentWindow<br />&nbsp; &nbsp; &nbsp; &nbsp; point=[[self parentWindow] convertScreenToBase:point];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; // création d&#39;un nouvel mouseEvent<br />&nbsp; &nbsp; &nbsp; &nbsp; mouseEvent=[NSEvent mouseEventWithType:NSLeftMouseDown<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; location:point<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; modifierFlags:[theEvent modifierFlags]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timestamp:[theEvent timestamp]+1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; windowNumber:[[self parentWindow] windowNumber]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context:[theEvent context]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; eventNumber:[theEvent eventNumber]+1<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; clickCount:[theEvent clickCount]<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pressure:[theEvent pressure]];<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; // envoi de ce nouvel event à  l&#39;application (qui le dispatchera à  la bonne fenêtre)<br />&nbsp; &nbsp; &nbsp; &nbsp; [NSApp sendEvent:mouseEvent];<br />	}<br /><br />&nbsp; &nbsp; // sinon si c&#39;est un autre event, on l&#39;envoie à  super (pour traitement standard)<br />	else [super sendEvent:theEvent];<br />}<br /><br />@end<br />
    


    Ici le code ne s'occupe que du mouseDown, mais tu peux l'adapter pour d'autres events.

    .
  • UniXUniX Membre
    00:44 modifié #6
    La méthode d'AliGator fonctionne à  merveille  :)
    Merci Bru et Aligator pour votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.