使用NSScreens时,如何在全局坐标和本地坐标之间进行转换?

时间:2011-12-06 02:12:40

标签: objective-c cocoa

我正在编写一个应用程序,用于操作窗口位置并添加多显示器支持。

为方便起见,我有“本地”窗口位置(相对于NSScreen的框架),我需要将其转换为“全局”窗口位置(相对于指定所有监视器位置的位置,我相信它是[NSScreen屏幕]的第一个(第0个)索引的左下角。

我想使用单个坐标系来存储我的窗口位置,并相对于全局坐标系执行此操作,然后转换为本地坐标系进行显示。

在NSScreen框架和全局屏幕空间之间转换坐标有哪些辅助方法?

1 个答案:

答案 0 :(得分:3)

听起来你只需要 - [NSScreen框架]。帧的原点是相对于零屏幕的帧原点([[NSScreen screens] objectAtIndex:0])。

顺便说一下,NSWindow的框架已经处于相对于零屏幕的框架原点的全局坐标系中。听起来你可能正在重塑它,但你可能有充分的理由去做。

作为一个例子,这里有两个函数可以转换全局点,并相对于屏幕的框架点:

extern NSPoint MyConvertLocalScreenPointToGlobal(NSScreen *screen, NSPoint local) {
    NSPoint global = {
        .x = [screen frame].origin.x + local.x,
        .y = [screen frame].origin.y + local.y,
    };
    return global;
}

extern NSPoint MyConvertGlobalScreenPointToLocal(NSScreen *screen, NSPoint global) {
    NSPoint local = {
        .x = global.x - [screen frame].origin.x,
        .y = global.y - [screen frame].origin.y,
    };
    return local;
}