Coordonnées fenêtre

RocouRocou Membre
03:39 modifié dans API AppKit #1
Bonjour,

Cela fait deux heures que je cherche comment obtenir les coordonnées d'une fenêtre  :(

Je voudrais positionner une fenêtre à  son ouverture en fonction d'une autre, déjà  affichée.

Réponses

  • schlumschlum Membre
    03:39 modifié #2
    C'est un grand classique ça...

    - (NSRect)frame
    - (void)setFrame:(NSRect)windowFrame display:(BOOL)displayViews


    Et le fameux calcul de la taille du frame en fonction de la taille de la content View :

    - (NSRect)frameRectForContentRect:(NSRect)windowContent
  • RocouRocou Membre
    03:39 modifié #3
    dans 1240219908:

    C'est un grand classique ça...

    Tu me rassures  :)
    dans 1240219908:

    - (NSRect)frame
    - (void)setFrame:(NSRect)windowFrame display:(BOOL)displayViews


    Et le fameux calcul de la taille du frame en fonction de la taille de la content View :

    - (NSRect)frameRectForContentRect:(NSRect)windowContent


    Honnêtement, je n'ai rien compris. Je ne vois pas le lien avec ma fenêtre ni comment extraire les coordonnées x et y de celle-ci.
  • schlumschlum Membre
    03:39 modifié #4
    "frame" donne un NSRect... origin.x, origin.y, size.x, size.y  ???

    Mais c'est le rectangle avec la barre de titre comprise... Les fonctions "frameRectForContentRect" et "contentRectForFrameRect" servent à  faire les conversions avec / sans barre de titre.
  • RocouRocou Membre
    03:39 modifié #5
    dans 1240221647:

    "frame" donne un NSRect... origin.x, origin.y, size.x, size.y  ???

    Mais c'est le rectangle avec la barre de titre comprise... Les fonctions "frameRectForContentRect" et "contentRectForFrameRect" servent à  faire les conversions avec / sans barre de titre.

    Je ne vois pas comment m'en servir.

    J'ai un Outlet
    IBOutlet NSWindow *maFenetre;

    Que dois-je faire avec?

    J'ai commencé comme suit mais qu'est que le windowContent?

    NSRect monRectangle;<br />monRectangle = [winMonCal frameRectForContentRect:???];
    
  • schlumschlum Membre
    03:39 modifié #6
    Non, juste "frame" dans ce cas...
  • 03:39 modifié #7
    le windowContent est simplement la vue de ta fenêtre, celle qui contient tous les éléments. Elle se récupère avec contentView.

    <br />NSRect monRectangle, contentViewRect;<br />NSView* winMonCalContentView;<br /><br />winMonCalContentView = [winMonCal contentView];<br /><br />contentViewRect = [winMonCalContentView frame];<br />monRectangle = [winMonCal frameRectForContentRect: contentViewRect];<br />
    



    Je t'ai joint une image pour que tu puisses comprendre un peu plus le principe de la contentView.

    Comme te l'a expliqué Schlum, la méthode "frameRectForContentRect" te permet de retourner la Frame de la fenêtre à  partir de son contentView. Au départ on aurait tendance à  dire que la fenêtre devra faire la taille de la contentView, mais non ! Il y a la barre de titre qui doit bien prendre 20px de hauteur voir plus, et puis si ta fenêtre a une barre d'outils, il faut la compter aussi.. bref, tu t'imagines mettre des conditions du genre "si (barreDoutils == YES) alors ajouter 80px de hauteur" ?
    Voilà  à  quoi sert frameRectForContentRect :) en gros ça prend la taille de la contentView (voir schéma) et retourne la frame de la fenêtre en comprenant tout ce qui est externe à  cette contentView, à  savoir la barre de titre, une toolbar, voir plus.


    Mais comme Schlum vient de dire, si tu veux avoir le rectangle de ta fenêtre il te suffit d'utiliser [myWindow frame];
  • RocouRocou Membre
    avril 2009 modifié #8
    dans 1240223912:

    le windowContent est simplement la vue de ta fenêtre, celle qui contient tous les éléments. Elle se récupère avec contentView.

    <br />NSRect monRectangle, contentViewRect;<br />NSView* winMonCalContentView;<br /><br />winMonCalContentView = [winMonCal contentView];<br /><br />contentViewRect = [winMonCalContentView frame];<br />monRectangle = [winMonCal frameRectForContentRect: contentViewRect];<br />
    


    J'obtiens systématiquement 0 et 0 comme coordonnées.

    dans 1240223912:

    Mais comme Schlum vient de dire, si tu veux avoir le rectangle de ta fenêtre il te suffit d'utiliser [myWindow frame];

    Par contre, ce code fonctionne, ouf!

    Schlum réponds toujours avec patience et gentillesse mais il oublie qu'il a affaire à  un "grand débutant"  :)
    [myWindow frame] c'est quelque chose qui me cause mais 'frame' tout seul, je ne voyais pas du tout où il voulait en venir.
    Mais ça s'éclaire peu à  peu.
  • schlumschlum Membre
    03:39 modifié #9
    Tu n'utilises pas AppKiDo pour la doc ?
    Une recherche de frame t'aurait donné la liste des classes l'utilisant, dont NSWindow  ;)
  • RocouRocou Membre
    03:39 modifié #10
    dans 1240230091:

    Tu n'utilises pas AppKiDo pour la doc ?
    Une recherche de frame t'aurait donné la liste des classes l'utilisant, dont NSWindow  ;)

    J'ai essayé tout au début en suivant ce conseil que tu donnais à  d'autre mais je ne voyais pas l'intérêt de ce truc vieillot par rapport à  la doc d'Apple. Je vais me repencher dessus, j'ai du passer à  côté de quelque chose  :)
  • NoNo Membre
    03:39 modifié #11
    Nul besoin de AppKiDo.

    A partir de xcode>documentation, ou simplement à  partir du site Apple developer :
    • Juste de lire la doc sur NSWindow,
    • de chercher le paragraphe Sizing,
    • de voir les méthodes de taille de fenêtre (ici frame, setFrameOrigin ou SetFrameTopLeftPoint me semblent plus qu'évidentes),
    • de cliquer sur le ou les liens desdites méthodes,
    • de voir pour frame le texte "frame rectangle of the window in screen coordinates",
    • de voir pour setFrameOrigin le texte "Positions the bottom-left corner of the window's frame rectangle at a given point in screen coordinates",
    • etc...


    Il y a vraiment un souci de lecture de la doc.
Connectez-vous ou Inscrivez-vous pour répondre.