Position de la souris dans une NSWindow

UniXUniX Membre
01:52 modifié dans API AppKit #1
Salut.

J'ai placé un bouton dans une fenêtre qui doit me servir à  modifier le frame de certaines vues de la fenêtre lorsque je clique dessus. Le bouton a l'attribut continuous, de ce fait, je voudrais pouvoir faire mon opération en live lorsque je déplace la souris en plus de cliquer le bouton.

Je cherche donc à  récupérer la position de la souris lors du clic. J'ai fait ça avec des vues, mais je ne sais pas trop la méthode pour une fenêtre... Notamment, les méthodes mouseDown, et mouseDragged.

Réponses

  • fouffouf Membre
    01:52 modifié #2
    Bah, normalement, c'est les mêmes que pour NSView car les deux descendent de NSResponder qui définit ces méthodes. Après, il ya peut-être des subtilitées mais comme je n'ai jamais essayé je ne peut pas te dire ... ;)
  • VeillardVeillard Membre
    01:52 modifié #3
    Tu as essayé ceci ?

    NSPoint posSouris;<br />	NSString *string;<br /><br />	if (NSPointInRect ([event locationInWindow], [myView frame]))<br />	{<br />		posSouris = [myView convertPoint: [event locationInWindow] fromView:nil];<br />		string = NSStringFromPoint (posSouris);<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />
    


    Dans mon cas, j'ai une NSView dans la NSWindow...
  • UniXUniX Membre
    01:52 modifié #4
    OK, c'était tout bête .... :P

    Par contre, je n'arrive pas à  obtenir ce que je souhaite.
    Je voudrais ajouter en haut à  droite d'une NSTableView une petite case qui va me permettre de faire varier la largeur de la NSTableView.
    Pour la NSTableView, je n'affiche en fait pas l'entête de colonne, que j'ai remplacé par 1 NSImageView pour la barre, et une custom view pour la fameuse petite case.

    J'ai envisagé de filtrer les clics et drag dans cette custom view, et de changer le frame de la NSTableView en conséquence.

    - (void) mouseDown: (NSEvent*) event<br />{<br />	NSPoint p = [event locationInWindow];<br />	if(NSPointInRect(p,[vueCorner frame]))<br />	{pointDown = p;}<br />	else<br />	{pointDown = NSZeroPoint;}<br />}<br /><br />- (void) mouseDragged: (NSEvent*) event<br />{<br />	double ecart = [event locationInWindow].x - pointDown.x;<br />	NSRect nouveauFrame = = [listeTable frame];<br />	nouveauFrame.size.width += ecart;<br />	[listeTable setFrame:nouveauFrame];<br />}
    


    Malheureusement la fenêtre se déplace, et visiblement, le frame ne varie pas .... :(
  • UniXUniX Membre
    01:52 modifié #5
    Vous voyez peut être pas de quelle petite case je veux parler ..... :)

    Voici un screenshot :
    case.jpg
  • UniXUniX Membre
    01:52 modifié #6
    Je remonte le sujet, car je suis toujours au point mort .....

  • 01:52 modifié #7
    Le plus simple si tu n'as pas envie de réinventer la roue est d'utiliser une RBSPlitView (http://www.brockerhoff.net/src/rbs.html).

    Consulte le main.m fourni pour sample app. Les 2 méthodes qui devraient t'intéresser sont:
    [tt]- (unsigned int)splitView:(RBSplitView*)sender dividerForPoint:(NSPoint)point inSubview:(RBSplitSubview*)subview; [/tt] pour rendre possible un redimensionnement sans passer par un diviseur "officiel"
    et
    [tt]- (NSRect)splitView:(RBSplitView*)sender cursorRect:(NSRect)rect forDivider:(unsigned int)divider [/tt] Celle là  est surtout cosmétique
  • BruBru Membre
    01:52 modifié #8
    Sans sortir l'artillerie lourde de Renaud, c'est très simple à  faire :
    il te suffit de monitorer le mouseDragged du cornerView, ensuite de récupérer les coords x de la souris, et enfin de redimenssionner le scrollView englobant la table.

    .
  • 01:52 modifié #9
    Bien sûr, mais le redimensionnement c'est qu'une facette de ce à  quoi il  faut penser pour ce genre d'opération: taille min/max de la scroll view, sauvegarde de la largeur dans les préférences,... Bon, je le reconnais, les autres facettes ne sont pas spécialement dures à  réaliser, mais là  il existe une solution toute faite (et vraiment bien foutue) dans le domaine public.
  • UniXUniX Membre
    01:52 modifié #10
    Oui, c'est ce que j'ai commencé à  faire. Par contre, lorsque je fais un drag sur ma vue, la méthode mouseDragged est bien appelée, mais j'ai la fenêtre qui se déplace.

    Je crois qu'il existe une méthode à  surclasser pour éviter ça, mais je ne retrouve plus laquelle ... :(
  • BruBru Membre
    août 2006 modifié #11
    Chez moi, aucun problème.

    Voici le .h du cornerView :
    <br />@interface CustomCornerView : NSView<br />{<br />    int state;<br />}<br />@end<br />
    


    puis le .m :
    <br />@implementation CustomCornerView<br /><br />- (void)mouseDown:(NSEvent *)theEvent<br />{<br />    state=1;<br />    [self display];<br />    return;<br />}<br /><br />- (void)mouseUp:(NSEvent *)theEvent<br />{<br />    state=0;<br />    [self display];<br />    return;<br />}<br /><br />- (void)mouseDragged:(NSEvent *)theEvent<br />{<br />    NSScrollView *sv;<br />    NSPoint pt;<br />    NSRect frame;<br /><br />    sv=(NSScrollView *)[self superview];<br />    pt=[sv convertPoint:[theEvent locationInWindow] fromView:nil];<br />    frame=[sv frame];<br />    frame.size.width=pt.x;<br />    [sv setFrame:frame];<br />    [sv display];<br />}<br /><br />- (void)drawRect:(NSRect)rect<br />{<br />    if (state==0) [[NSColor controlBackgroundColor] set];<br />    else [[NSColor controlHighlightColor] set];<br />    NSRectFill(rect);<br />}<br /><br />- (BOOL)isOpaque<br />{<br />    return YES;<br />}<br /><br />@end
    


    J'ai ajouté ce customCornerView via setCornerView: dans le awakeFromNib du contrôleur de la fenêtre.

    .
  • UniXUniX Membre
    01:52 modifié #12
    Bon, moi j'avais viré l'en-tête de colonne de la tableView pour diverses raisons, et j'utilisais une custom view.
    Mais bon, j'ai réussi à  contourner ou résoudre tous les problèmes que j'avais, et j'ai pu remettre un fonctionnement plus classique avec la cornerView.

    Merci pour votre aide.
Connectez-vous ou Inscrivez-vous pour répondre.