On Mar 31, 2009, at 9:34 PM, Trygve Inda wrote:
Using these two calls:
NSRect nsRect = [screen frame];
CGRect cgRect = CGDisplayBounds (displayID);
I get for my two screens:
NS x=0 y=0 w=2560 h=1600 // screen A
CG x=0 y=0 w=2560 h=1600
NS x=-1920 y=184 w=1920 h=1200 // screen B
CG x=-1920 y=216 w=1920 h=1200
It seems CG origin is Top, Left with y growing down, while NS is
origin
Bottom, Left, y growing up. So I convert CG to NS with:
// Convert CG coordinates from (TL, y down) to (BL, y up)
CGRect mainScreenRect = CGDisplayBounds (CGMainDisplayID ());
cgRect.origin.y = (cgRect.origin.y + cgRect.size.height -
mainScreenRect.size.height) * -1;
(216 + 1200 - 1600) * -1 = 184
Is there a system function that does this? NSRectFromCGRect does
not
do the
coordinate conversion.
No, there is no function to do this conversion.
Note that your conversion has a subtle bug that will fail for
multiple
displays. The CG coordinate system has its origin at the top of the
zero screen, not the main screen (which changes with the user
focus).
The zero screen is the screen at index zero in the +screens array.
So if you define a function like this:
CGFloat zeroScreenHeight(void) {
CGFloat result = 0;
NSArray *screens = [NSScreen screens];
if ([screens count] > 0) result = NSHeight([[screens objectAtIndex:
0] frame]);
return result;
}
then you can do screen-coordinate conversions like this:
NSMakePoint(cgPoint.x, zeroScreenHeight() - cgPoint.y);
NSMakeRect(cgRect.origin.x, zeroScreenHeight() - cgRect.origin.y -
cgRect.size.height, cgRect.size.width, cgRect.size.height);
-Peter
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden