2009-06-20 3 views
0

Ich schreibe eine Anwendung zeichnet in einem anderen Anwendungsfenster (das ist unter OS X mit Cocoa, aber die Frage ist allgemein genug, dass ich hoffe, dass es nicht vom Betriebssystem festgefahren wird/Framework-Probleme), und ich stoße auf ein Problem, das anscheinend eine einfache Antwort haben sollte, aber es macht mich absolut verrückt. Hier ist das Problem:Ränder für das Zeichnen nach der Fenstergrößenänderung beibehalten

Ich zeichne ein Rechteck in einem anderen Anwendungsfenster, das an einer bestimmten Stelle relativ zum oberen und linken Rand des Fensters sein muss (dh die Ränder zwischen meinem Rechteck und dem oberen & links vom Zielfenster müssen fest bleiben). Ich kann die relativen x, y Koordinaten berechnen, die als Prozentsatz der Fenstergröße benötigt werden, was gut funktioniert: das Rechteck wird korrekt angezeigt. Der Benutzer ändert dann jedoch die Größe des Fensters, und ich kann das Rechteck korrekt ändern, indem eine Transformation basierend auf dem Verhältnis der neuen Höhe und Breite zur alten Höhe und Breite verwendet wird, aber ich verliere meine relative Positionierung: Die Koordinaten des Rechtecks ​​sind jetzt falsch (siehe Bild - das ist ein grober Nachbau des Problems).

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

Nun habe ich nicht herausfinden kann, wie die neuen x zu berechnen, y-Koordinaten relativ zu dem oberen und dem Fenster verlassen. Das Fenster ist nicht quadratisch; Die Größenänderung wird durch die andere Anwendung eingeschränkt, aber das Seitenverhältnis Breite/Höhe ändert sich um eine unbekannte Funktion. Wenn ich die erforderlichen y-Koordinaten relativ ausmache, ändert sich der Prozentsatz, wenn das Fenster seine Größe ändert. Numerisch, sieht es so etwas wie diese:

Vor Resize:
Fenstergröße: h => 760, w => 546
Rechteck Herkunft: x => 355, y => 84 (zB 84/546 = 15,3 % der Höhe)

Nach resize:
Fenstergröße: h => 1009, w => 717
sollte Rechteck Ursprung sein:? (Ich kann es als etwas wie x => 474, y => 99 messen, aber ich kann nicht vorherzusagen diese Werte; 99/717 jetzt = 13,8% der Höhe).

Ich habe jedes Verhältnis der beiden Fenster Messungen ausprobiert, die ich mir vorstellen kann; Ich bin auch auf die Idee gestoßen, in den Ursprung zu übersetzen, zu skalieren und dann zurück zu übersetzen, um das Problem der Skalierung beim Verschieben der Koordinaten zu vermeiden - aber ich weiß nicht, wohin ich zurückübersetzen soll! Dies hat wahrscheinlich eine einfache geometrische/trigonometrische Lösung, aber mir fällt nichts ein, egal wie viele Diagramme ich zeichne. Ich bin bereit, die unvermeidliche Verlegenheit zu akzeptieren, dass jemand auf eine Ein-Zeilen-Lösung für dieses Problem hinweist, wenn sie mich hier in die richtige Richtung weisen kann!

+0

"Ich zeichne ein Rechteck in das Fenster einer anderen Anwendung ..." Wie geht es Ihnen? –

+0

Sorry, das hört sich komisch an, so wie ich es geschrieben habe. Ich zeichne nicht direkt in ihr Fenster, ich erzeuge nur ein neues Fenster über den angegebenen Koordinaten (NSWindow mit der Ebene NSStatusWindowLevel). – Winawer

Antwort

0

für die Nachwelt : Ich habe wirklich keine Ahnung, wie Apple (oder irgendjemand anderes) das macht - und ehrlich gesagt denke ich, dass die Anwendung, mit der ich versuche zu interagieren, nicht in diesem Sinne geschrieben wurde, da sie weit davon entfernt ist, zugänglich zu sein. Um das Problem zu lösen, habe ich einfach eine ganze Reihe verschiedener (x, y) Paare abgetastet und ein lineares Modell konstruiert, um die richtigen Koordinaten für beliebige Koordinaten vorherzusagen. Ein bisschen wie ein Vorschlaghammer, aber es ist das Beste, was ich mir vorstellen kann.

0

Wenn Sie es wollen, von oben left Einheiten von links und top Einheiten sein, dann versuchen, den Ursprung als:

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

+0

Aber ... ich weiß nicht, was oben ist, nachdem das Fenster die Größe ändert. Das ist die unbekannte Menge. Oder verpasse ich hier etwas? Ich kann das Rechteck vor dem Verschieben als 546 + 84 positionieren (Ursprung befindet sich oben links), aber nachdem das Fenster seine Größe ändert, habe ich nur die neue Höhe als 717. Der neue Ursprung sollte 717 + x sein, aber ich nicht Was ist zu setzen, um x den gleichen relativen Abstand von oben wie zuvor beizubehalten? (Ich habe es als 99 gemessen, aber ich weiß nicht, wie ich diesen Wert aus dem berechnen soll, was ich habe.) – Winawer

+0

Wollten Sie nicht den Abstand von der Spitze konstant halten? –

+0

Die Ränder sind konstant, aber die Entfernung von oben ist nicht wegen der Fenstergröße. Ich weiß nicht, wie ich es besser erklären soll, was wahrscheinlich ein Teil des Problems ist. In Interface Builder sieht das in den Autoresizing-Steuerelementen folgendermaßen aus: http://img221.imageshack.us/img221/7292/ibexample.png, obwohl ich mich nur um die obere und linke Seite kümmere. Beachten Sie, wie die Ränder gleich bleiben, obwohl das Fenster seine Größe ändert; Wenn das meine eigene App wäre, würde Cocoa das für mich tun, aber ich bin damit konfrontiert, dass ich das jetzt selbst berechnen muss, und ich habe Probleme. – Winawer