Pb lors du déplacement d'un objet dans une vue

UniXUniX Membre
15:12 modifié dans API AppKit #1
Salut.

Voilà , j'ai un pb ....

Je souhaiterais mettre en place la possibilité de déplacer des objets dans une vue. Pour cela, j'utilise mouseDown et mouseDragged.

Ca marche à  un détail près, c'est que la fenêtre se déplace en même temps  ??? Mon objet se déplace dans sa vue, et la fenêtre se déplace d'autant.

Réponses

  • AliGatorAliGator Membre, Modérateur
    15:12 modifié #2
    dans 1129893519:

    Salut.

    Voilà , j'ai un pb ....

    Je souhaiterais mettre en place la possibilité de déplacer des objets dans une vue. Pour cela, j'utilise mouseDown et mouseDragged.

    Ca marche à  un détail près, c'est que la fenêtre se déplace en même temps  ??? Mon objet se déplace dans sa vue, et la fenêtre se déplace d'autant.

    ??? Un bout de code pour aider ?
  • UniXUniX Membre
    15:12 modifié #3
    Ben là , le pb ne vient du code, d'ailleurs lorsque je vire tout, ma fenêtre bouge aussi.
    C'est un soucis de responder, je pense. Le drag est transmis à  ma vue perso, mais aussi à  la fenêtre, en même temps.

    Alors que j'ai une autre vue perso dans la même fenêtre, et là  ça fonctionne correctement.
  • BruBru Membre
    octobre 2005 modifié #4
    1. ta fenêtre est sans doute textured ou est déplaçable en cliquant dans son fond (setMovableByWindowBackground:).

    2. la méthode mouseDragged: de ta custom view doit être mal implémentée : il faudrait que tu nous montres le code.

    .
  • UniXUniX Membre
    15:12 modifié #5
    Oui effectivement ma fenêtre est textured.

    Voici le code de mouseDown et mouseDragged :
    - (void)mouseDown:(NSEvent *)event<br />{<br />	NSPoint point = [self convertPoint:[event locationInWindow] fromView:nil];<br />	if(NSPointInRect(point, cadreRouge))<br />	{pointDown = point;}	<br />	else<br />	{pointDown = NSZeroPoint;}	<br />}<br /><br />- (void)mouseDragged:(NSEvent *)event<br />{<br />	if(pointDown.x != 0 &amp;&amp; pointDown.y != 0)<br />	{<br />		NSPoint dragPoint = [self convertPoint:[event locationInWindow] fromView:nil];<br />		double ecartX = dragPoint.x - pointDown.x;<br />		double ecartY = dragPoint.y - pointDown.y;<br />		cadreRouge.origin.x += ecartX;<br />		cadreRouge.origin.y += ecartY;<br />		[self setNeedsDisplay:YES];<br />	}<br />}
    
  • UniXUniX Membre
    15:12 modifié #6
    Bon, ben j'ai résolu de façon bancale en mettant : setMovableByWindowBackground:NO à  ma fenetre. C'était pas d'une utilité énorme, mais je vais quand même essayer de comprendre pour la prochaine fois ...
  • Eddy58Eddy58 Membre
    octobre 2005 modifié #7
    Tu peux toujours essayer de bloquer la fenêtre sur sa position pendant le dragging : :)

    dans 1129901067:

    [tt]
    - (void)mouseDragged:(NSEvent *)event
    {
         if(pointDown.x != 0 && pointDown.y != 0)
    {
         NSRect frameFenetre=[maWindow frame];

    NSPoint dragPoint = [self convertPoint:[event locationInWindow] fromView:nil];
    double ecartX = dragPoint.x - pointDown.x;
    double ecartY = dragPoint.y - pointDown.y;
    cadreRouge.origin.x += ecartX;
    cadreRouge.origin.y += ecartY;
    [self setNeedsDisplay:YES];

         [maWindow setFrameOrigin:NSMakePoint([frameFenetre.origin.x],[frameFenetre.origin.y])];
    }
    }
    [/tt]

    D'une autre façon, tu peux aussi essayer de jongler avec setMovableByWindowBackground. C'est plus propre que la méthode ci-dessus. La variable isCadreDragged, de type BOOL doit être définie dans ton interfaçage :
    [tt]
    -(void)mouseDragged:(NSEvent *)event
    {
          if(pointDown.x != 0 && pointDown.y != 0)
          {
              isCadreDragged=YES;
              [maWindow setMovableByWindowBackground:NO];         

              NSPoint dragPoint = [self convertPoint:[event locationInWindow] fromView:nil];
              double ecartX = dragPoint.x - pointDown.x;
              double ecartY = dragPoint.y - pointDown.y;
              cadreRouge.origin.x += ecartX;
              cadreRouge.origin.y += ecartY;
              [self setNeedsDisplay:YES];
           }
    }

    -(void)mouseUp:(NSEvent *)event
    {
         if (isCadreDragged==YES)
         {
              isCadreDragged=NO;
              [maWindow setMovableByWindowBackground:YES];
         }
    }
    [/tt]
  • BruBru Membre
    15:12 modifié #8
    dans 1129911169:

    Bon, ben j'ai résolu de façon bancale en mettant : setMovableByWindowBackground:NO à  ma fenetre. C'était pas d'une utilité énorme, mais je vais quand même essayer de comprendre pour la prochaine fois ...


    Non, il y a plus simple et plus propre bien-sur...

    Ajoute ça dans ta custom-class, et le tour sera joué :

    <br />- (BOOL)mouseDownCanMoveWindow<br />{<br />&nbsp; &nbsp; return NO;<br />}<br />
    


    .
  • Eddy58Eddy58 Membre
    15:12 modifié #9
    Ha oui, je n'étais pas aller voir ce que propose NSView. En effet, c'est encore bien plus simple ainsi.:)
  • UniXUniX Membre
    15:12 modifié #10
    Et oui, ça marche nickel ....

    Bru tu es vraiment une encyclopédie de Cocoa ..... o:)

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