将给定点从窗口的基本坐标系转换为屏幕坐标系

时间:2011-06-16 10:55:09

标签: macos core-graphics quartz-graphics macos-carbon

我试图找出将给定点从窗口的基本坐标系转换为屏幕坐标系的方法。我的意思是- (NSPoint)convertBaseToScreen:(NSPoint)point.

但我希望它来自石英/碳。

我有CGContextRef和它的Bounds。但是边界是关于CGContextRef所属的Window。例如,如果窗口相对于屏幕位于(100,100,50,50)位置,则窗口的contextRef将为(0,0,50,50)。即我在位置(0,0)但实际上在屏幕上我是(100,100)。我

任何建议都表示赞赏。

谢谢。

2 个答案:

答案 0 :(得分:0)

窗口在全局屏幕空间中保持自己的位置,合成器知道如何将该窗口的图像放在屏幕空间中的正确位置。然而,上下文本身没有位置。

Quartz Compositor知道窗口在屏幕上的位置,但Quartz 2D不知道它应该绘制的区域有多大。一旦完成,它就不知道Quartz Compositor将把绘图放在哪里。

类似地,当组合窗口的内容时,框架提供视图系统。视图系统允许OS创建用于绘制窗口的各个部分的上下文,并通常通过操纵上下文的变换或通过创建临时的屏幕外上下文来管理这些视图中绘图结果的放置。但是,上下文本身并不知道最终图形的呈现位置。

答案 1 :(得分:-1)

我不确定你是否可以直接使用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;
}