2013-11-09 26 views
11

我正在尝试为我的应用程序创建一个图像“放大镜”,可用于检查不同放大倍数的图像,并且遇到了一些道路颠簸。我正在使用Quartz创建一个CGImageRef快照,显示我的应用程序窗口所在的显示的选定部分。问题是,所有不同的OS X技术使用的命名法让我感到非常困惑。在Objective-C(OS X)中,Quartz Display Services使用的“全局显示”坐标空间与Cocoa的“屏幕”坐标空间相同吗?

我使用的功能是CGDisplayCreateImageForRect(CGDirectDisplayID display, CGRect rect)。该文档指出CGRect rect参数是“矩形,在显示空间中指定,用于将部分显示复制到图像中。”问题是,我在控制台中输出的结果并不是我期望的。我已经尝试了很多不同的转换,转换,坐标翻转等等,我现在百分之百地困惑了。

所以,我想我的问题归结为:屏幕空间==设备空间==显示空间,以及如何正确地转换他或她的视图的框架(这恰好是一个自定义无边框窗口)坐标(左下角原点)以匹配显示器的坐标(左上角原点)?

如果有人能够让我变直,或者指向正确的方向,我会永远感激。谢谢!

回答

15

石英使用坐标空间,其中原点(0,0)位于主显示屏的左上角。越来越多的y下降。

Cocoa使用坐标空间,其中原点(0,0)是主显示屏的左下角,并且y上升。

您可以从可可转换窗口的框架,以石英,像这样:

NSRect frame = window.frame; 
frame.origin.y = NSMaxY(NSScreen.screens[0].frame) - NSMaxY(frame); 
CGRect quartzRect = NSRectToCGRect(frame); 

注意:您不使用窗口的-screen,你总是使用主屏幕。

这是用于窗口坐标中的矩形。对于视图中的矩形,首先使用-[NSView convertRect:toView:]nil作为表示窗口的目标视图,从视图坐标转换为窗口坐标。这对someView.bounds来说是正确的,但对someView.frame不适用,因为视图的框架位于超视图的坐标系中。

+0

谢谢,肯。我已经解决了所有问题(包括我的数千个“NSLog()”调用),并从头开始修复了我的问题。我认为我最大的问题是我有这么多的转换,并协调翻转,一个会取消另一个。尽管如此,我很欣赏你的细分。我从来没有想过边界/框架的差异。这可能是我出错的地方。我剩下的唯一问题是:“屏幕空间”是否等于“设备空间?”它们是否与“全球展示空间”同义呢?我开始认为我的耳朵之间有一个很大的空间。 :-( –

+5

“设备空间”是指像素,它的原点通常是特定于设备的,“本地显示空间”使用点,但其原点位于特定显示的左上角。坐标空间,所有显示器都位于其中,它的原点位于主显示屏的左上角,“屏幕空间”是可可坐标空间,其原点位于主显示屏的左下角 –

+1

那么,你的解释正是我一直在寻找的,谢谢你,百万人, –

相关问题