Преобразовать данную точку из базовой системы координат окна в систему координат экрана - PullRequest
2 голосов
/ 16 июня 2011

Я пытаюсь выяснить способ преобразования заданной точки из базовой системы координат окна в систему координат экрана.Я имею в виду что-то вроде - (NSPoint)convertBaseToScreen:(NSPoint)point.

Но я хочу это из кварца / углерода.

У меня есть CGContextRef и его границы со мной.Но границы относятся к окну, к которому принадлежит CGContextRef.Например, если окно находится в местоположении (100, 100, 50, 50) относительно экрана, contextRef для окна будет (0,0, 50, 50).то есть я нахожусь в местоположении (0,0), но фактически на экране я в (100,100).Я

Любые предложения приветствуются.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 июля 2011

Окно сохраняет свою позицию в глобальном пространстве экрана, и композитор знает, как поместить изображение этого окна в правильное место на экране.Сам контекст, однако, не имеет местоположения.

Quartz Compositor знает, где расположено окно на экране, но Quartz 2D не знает ничего, кроме того, насколько велика область, на которой он должен рисоваться.Он не знает, куда Quartz Compositor собирается поместить чертеж после его завершения.

Аналогично, при объединении содержимого окна фреймворки предоставляют систему представления.Система представлений позволяет ОС создавать контексты для рисования отдельных частей окна и управляет размещением результатов рисования в этих видах, обычно путем манипулирования преобразованием контекста или создания временных закадровых контекстов.Однако сам контекст не знает, где будет отображаться окончательный рисунок.

0 голосов
/ 30 июня 2011

Я не уверен, что вы можете напрямую использовать CGContextRef, вам нужна ссылка на окно или представление или что-то вроде преобразования. Код, который я использую, выполняет обратное преобразование координат мыши из глобального (экрана) для просмотра локального, и выглядит примерно так:

Point mouseLoc; // point you want to convert to global coordinates
HIPoint where; // final coordinates
PixMapHandle portPixMap;
// portpixmap is needed to get correct offset otherwise y coord off at least by menu bar height
portPixMap = portPixMap = GetPortPixMap( GetWindowPort( GetControlOwner( view ) ) );
QDGlobalToLocalPoint(GetWindowPort( GetControlOwner( view ), &mouseLoc);
where.x = mouseLoc.h - (**portPixMap).bounds.left;
where.y = mouseLoc.v - (**portPixMap).bounds.top;
HIViewConvertPoint( &where, NULL, view );

поэтому, я думаю, вам нужно обратное (не проверял, работает ли оно на самом деле):

void convert_point_to_screen(HIView view, HIPoint *point)
{
    Point point; // used for QD calls
    PixMapHandle portPixMap = GetPortPixMap( GetWindowPort( GetControlOwner( view ) ) );

    HIViewConvertPoint( &where, view, NULL ); // view local to window local coordtinates

    point.h = where->x + (**portPixMap).bounds.left;
    point.w = where->y + (**portPixMap).bounds.top;

    QDLocalToGlobalPoint(GetWindowPort( GetControlOwner( view ), &point);

    // convert Point to HIPoint
    where->x = point.h;
    where->y = point.v;
}
...