2009-05-12 11 views
8

J'utilise CGWindowListCopyWindowInfo pour obtenir une liste de toutes les fenêtres. Il me donne les coordonnées de chaque fenêtre en fonction de l'origine étant le supérieur gauche de l'écran.Comment convertir l'origine de cacao co-ords de haut à gauche == origine en bas à gauche ==

Si j'utilise la méthode de setFrame de NSWindow, les coordonnées sur base de l'origine étant la partie inférieure gauche- de l'écran.

Ce qui est une façon propre et fiable pour convertir l'un à l'autre?

Ajouté: Par propre et fiable, je veux dire, quelque chose que travailler, que l'utilisateur dispose de plusieurs écrans ou utilise des espaces. Je pense qu'il doit y avoir un idiome connu utilisant des API de bibliothèque.

Répondre

10

Math est tout à fait fiable :-)

yFromBottom = screenHeight - windowHeight - yFromTop 

hauteur de l'écran principal est

[[[NSScreen screens] objectAtIndex:0] frame].size.height 
+1

Note: Il semble que les coordonnées de la fenêtre sont toujours par rapport à l'écran principal (pas la propriété de l'écran de la fenêtre) –

2

Essayez quelque chose comme ça (from here):

NSRect boundsInWindow = [myView convertRect:[myView bounds] toView:nil]; 
NSRect visibleRectInWindow = [myView convertRect:[myView visibleRect] toView:nil]; 

// Flip Y to convert NSWindow coordinates to top-left-based window coordinates. 
float borderViewHeight = [[myView window] frame].size.height; 
boundsInWindow.origin.y = borderViewHeight - NSMaxY(boundsInWindow); 
visibleRectInWindow.origin.y = borderViewHeight - NSMaxY(visibleRectInWindow); 
4

Je suggère d'utiliser un NSAffineTransform . Si vous dessinez par rapport à l'origine par défaut, puis que vous appliquez une transformation à la vue, vous pouvez inverser les choses d'un seul coup.

+1

puis-je voir un échantillon de cela? –

Questions connexes