2009-06-20 17 views
0

J'écris une application dessine dans la fenêtre d'une autre application (c'est sous OS X avec Cocoa, mais la question est assez générale que j'espère qu'elle ne sera pas enlisée par le système d'exploitation/problèmes de cadre), et je me heurte à un problème qui semble devoir être résolu, mais qui me rend absolument fou. Voici le problème:Conserver les marges pour dessiner après le redimensionnement de la fenêtre

Je dessine un rectangle à l'intérieur de la fenêtre d'une autre application qui doit être à un certain endroit par rapport au haut et à gauche de la fenêtre (ie les marges entre mon rectangle et le haut de la fenêtre cible doivent rester fixe). Je peux calculer les coordonnées x, y relatives requises en pourcentage de la taille de la fenêtre, ce qui fonctionne bien: le rectangle s'affiche correctement. Cependant, l'utilisateur redimensionne la fenêtre, et je peux redimensionner correctement le rectangle en utilisant une transformation basée sur le rapport de la nouvelle hauteur et largeur à l'ancienne hauteur et largeur, mais je perds mon positionnement relatif: les coordonnées du rectangle sont maintenant incorrectes (Voir l'image - c'est une maquette approximative du problème).

image http://img30.imageshack.us/img30/5273/resizeexample.png

Maintenant, je ne peux pas comprendre comment calculer les nouvelles coordonnées x, y par rapport au haut et à gauche de la fenêtre. La fenêtre n'est pas carrée. son redimensionnement est contraint par l'autre application, mais le rapport hauteur/largeur change par une fonction inconnue. Lorsque je mesure les coordonnées y requises en termes relatifs, le pourcentage change lorsque la fenêtre est redimensionnée. Numériquement, il ressemble à ceci:

Avant Redimensionner:
taille de la fenêtre: h => 760, w => 546
origine rectangle: x => 355, y => 84 (par exemple 84/546 = 15,3 % de la hauteur)

Après redimensionnement:
taille de la fenêtre: h => 1009, origine rectangle w => 717
doit être:? (Je peux le mesurer comme quelque chose comme x => 474, y => 99, mais je ne peux pas prédire ces valeurs, 99/717 maintenant = 13,8% de la hauteur). J'ai essayé tous les rapports des mesures des deux fenêtres auxquelles je peux penser; J'ai également croisé l'idée de traduire vers l'origine, de redimensionner, puis de traduire en arrière pour éviter le problème de mise à l'échelle en déplaçant les coordonnées - mais je ne sais pas où traduire à! Cela a probablement une solution géométrique/trigonométrique simple, mais rien ne me vient à l'esprit, peu importe le nombre de diagrammes que je dessine. Je suis prêt à accepter l'embarras inévitable de quelqu'un qui pointe une solution d'une ligne à ce problème s'il peut simplement me pointer dans la bonne direction ici!

+0

"Je dessine un rectangle dans la fenêtre d'une autre application ..." Comment faites-vous cela? –

+0

Désolé, ça a l'air bizarre comme je l'ai écrit. Je ne dessine pas directement dans leur fenêtre, je crée juste une nouvelle fenêtre sur les coordonnées spécifiées (NSWindow avec le niveau défini sur NSStatusWindowLevel). – Winawer

Répondre

0

pour la postérité : Je n'ai vraiment aucune idée de comment Apple (ou quelqu'un d'autre) fait cela - et honnêtement, je pense que l'application avec laquelle j'essaye d'interagir n'a pas été écrite avec ça en tête, car elle est loin d'être accessible. Pour résoudre le problème, j'ai juste fini par échantillonner tout un tas de paires (x, y) différentes et à construire un modèle linéaire pour prédire les bonnes coordonnées pour des coordonnées arbitraires. Un peu d'un marteau, mais c'est le meilleur que je pourrais trouver.

0

Si vous voulez qu'il soit left unités de la gauche et top unités du haut, puis essayez l'origine comme:

x: left
y: window.frame.size.height - rectangle.frame.size.height - top

+0

Mais ... je ne sais pas quel est le top après le redimensionnement de la fenêtre. C'est la quantité inconnue. Ou est-ce que je manque quelque chose ici? Je peux positionner le rectangle avant le mouvement comme 546 + 84 (l'origine est en haut à gauche), mais après le redimensionnement de la fenêtre, j'ai seulement la nouvelle hauteur en 717. La nouvelle origine devrait être 717 + x, mais je ne quoi mettre x pour garder la même distance relative par rapport au haut comme avant. (Je l'ai mesuré comme 99, mais je ne sais pas comment calculer cette valeur à partir de ce que j'ai.) – Winawer

+0

Vous ne vouliez pas garder la distance du haut constant? –

+0

Les marges sont constantes, mais la distance par rapport au sommet n'est pas due au redimensionnement de la fenêtre. Je ne sais pas comment l'expliquer mieux que cela, ce qui fait probablement partie du problème. Dans Interface Builder, cela ressemble à ceci dans les contrôles autoresizing: http://img221.imageshack.us/img221/7292/ibexample.png, bien que je ne sois concerné que par le haut et la gauche. Notez comment les marges restent les mêmes même si la fenêtre est redimensionnée; Si c'était ma propre application, Cocoa ferait cela pour moi, mais je dois maintenant calculer cela moi-même, et j'ai des problèmes. – Winawer

Questions connexes