Как преобразовать кокард Какао из левого верхнего == источника в нижний левый == источник

Я использую CGWindowListCopyWindowInfo, чтобы получить список всех окон. Это дает мне координаты каждого окна, основываясь на том, что начало координат находится в верхнем левом углу экрана.

Если я использую метод setFrame NSWindow, координаты на основе источника лежат в левом нижнем углу экрана.

Какой чистый, надежный способ конвертировать из одного в другой?

Добавлено: Под чистым и надежным, я имею в виду, что-то обязательно будет работать независимо от того, использует ли пользователь несколько экранов или использует пробелы. Я полагаю, что должна быть известная идиома, использующая библиотечные API.

3 ответа

Решение

Математика довольно надежна:-)

yFromBottom = screenHeight - windowHeight - yFromTop

Высота основного экрана

[[[NSScreen screens] objectAtIndex:0] frame].size.height

Я бы предложил использовать NSAffineTransform. Если вы рисуете относительно исходного положения по умолчанию, а затем применяете преобразование к представлению, вы можете по существу перевернуть вещи одним махом.

Попробуйте что-то вроде этого ( отсюда):

NSRect boundsInWindow = [myView convertRect:[myView bounds] toView:nil];
NSRect visibleRectInWindow = [myView convertRect:[myView visibleRect] toView:nil];

// Flip Y to convert NSWindow coordinates to top-left-based window coordinates.
float borderViewHeight = [[myView window] frame].size.height;
boundsInWindow.origin.y = borderViewHeight - NSMaxY(boundsInWindow);
visibleRectInWindow.origin.y = borderViewHeight - NSMaxY(visibleRectInWindow);
Другие вопросы по тегам