我试图为我的应用程序创建一个可以用于以不同放大级别检查图像的图像“放大镜”,并且我遇到了一些路障.我使用Quartz来创建一个CG
ImageRef快照,显示我应用程序窗口所在部分的一部分.问题是,所有不同OS X技术所使用的术语我真的很困惑.
我使用的功能是CGDisplayCreateImageForRect(CGDirectDisplayID显示,CGRect rect).文档说明了CGRect rect参数是“在显示空间中指定的矩形,将显示的部分复制到图像中”.问题是,我在控制台中输出的输出不是我所期待的.我已经尝试了许多不同的转换,转换,协调翻转等,现在我已经100%混淆了.
所以,我想我的问题归结为:屏幕空间==设备空间==显示空间,如何正确地转换他或她的视图的框架(这恰好是一个自定义的无边界窗口)坐标(左下角的起点)来匹配显示器的坐标(左上角的原点)?
如果有人可以让我直率,或指向正确的方向,我会永远感激.谢谢!
解决方法
Quartz使用原点(0,0)位于主显示屏左上角的坐标空间.增加y下降.
可可使用坐标空间,其中原点(0,0)是主显示的左下角,并且y增加.
您可以将窗口的框架从Cocoa转换为Quartz,如下所示:
NSRect frame = window.frame; frame.origin.y = NSMaxY(NSScreen.screens[0].frame) - NSMaxY(frame); CGRect quartzRect = NSRectToCGRect(frame);
注意:您不使用窗口的屏幕,您始终使用主屏幕.
这是用于窗口坐标的直角.对于视图中的rect,首先使用 – [NSView convertRect:toView:]将视图坐标转换为窗口坐标,其中nil表示窗口的目标视图.这对于someView.bounds来说是正确的,但是对于someView.frame而言,这样做是正确的,因为视图的框架位于超级视图的坐标系中.