В Objective-C (OS X) пространство координат "глобального отображения", используемое Quartz Display Services, совпадает с пространством координат "экрана" Какао?

Я пытаюсь создать изображение "лупа" для своего приложения, которое можно использовать для проверки изображений с различными уровнями увеличения, и я столкнулся с небольшим дорожным ударом. Я использую Кварц, чтобы создать CGImageRef снимок выбранной части экрана, окно моего приложения включено. Проблема в том, что номенклатура, используемая всеми различными технологиями OS X, действительно запутала меня.

Я использую функцию CGDisplayCreateImageForRect(CGDirectDisplayID display, CGRect rect), В документации говорится CGRect rect Параметр - это "прямоугольник, указанный в области отображения, для части экрана, копируемой в изображение". Проблема в том, что вывод, который я получаю в своей консоли, не соответствует ожиданиям. Я пробовал так много разных преобразований, трансформаций, сальто и т. Д., Что теперь я на 100% запутался.

Итак, я предполагаю, что мой вопрос сводится к следующему: отображает ли пространство экрана == пространство устройства == пространство экрана и как правильно преобразовать координаты своего кадра (который является пользовательским окном без полей) координат (источник слева внизу)), чтобы соответствовать координат дисплея (левый верхний начало)?

Если бы кто-то мог направить меня прямо или направить меня в правильном направлении, я был бы всегда благодарен. Спасибо!

1 ответ

Решение

Кварц использует координатное пространство, где начало координат (0, 0) находится в верхнем левом углу основного дисплея. Увеличение у идет вниз.

Какао использует координатное пространство, где начало координат (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, поскольку кадр вида находится в системе координат суперпредставления.

Другие вопросы по тегам