14

我正在尝试为我的应用程序创建一个图像“放大镜”,可用于检查不同放大级别的图像,但我遇到了一些障碍。我正在使用 Quartz 创建CGImageRef我的应用程序窗口所在显示的选定部分的快照。问题是,所有不同 OS X 技术使用的命名法让我很困惑。

我正在使用的功能是CGDisplayCreateImageForRect(CGDirectDisplayID display, CGRect rect). 文档说明该CGRect rect参数是“在显示空间中指定的矩形,用于复制到图像中的显示部分”。问题是,我在控制台中得到的输出不是我所期望的。我已经尝试了很多不同的转换、转换、坐标翻转等,我现在 100% 感到困惑。

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

如果有人能让我直截了当,或者指出我正确的方向,我将永远感激不尽。谢谢!

4

1 回答 1

22

Quartz 使用原点 (0, 0) 位于主显示器左上角的坐标空间。增加 y 下降。

Cocoa 使用坐标空间,其中原点 (0, 0) 位于主显示器的左下角,并且 y 增加向上。

您可以将窗口的框架从 Cocoa 转换为 Quartz,如下所示:

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

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

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

于 2013-11-10T07:03:44.250 回答