2013-11-09 33 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

那麼,你的解釋正是我一直在尋找的,謝謝你,百萬人, –

相關問題