简体   繁体   English

在可可和碳坐标之间转换?

[英]Converting between Cocoa and Carbon coordinates?

I am looking for a robust (I mean working in all multi-munitor configuration) algo to convert a cocoa point/rect to carbon equivalent and the reverse operation. 我正在寻找一种可靠的算法(我的意思是在所有多监视器配置中工作),以将可可点/直方图转换为碳当量并进行反向操作。

I've googled but was unable to find something which work properly. 我已经用谷歌搜索,但是找不到能正常工作的东西。

Thanks in advance for your help. 在此先感谢您的帮助。

Regards, 问候,

After several iterations I got to the following category on NSScreen : 经过几次迭代,我在NSScreenNSScreen了以下类别:

+ (NSScreen*) screenWithPoint: (NSPoint) p
{
    for (NSScreen *candidate in [NSScreen screens])
        if (NSPointInRect(p, [candidate frame]))
            return candidate;
    return nil;
}

+ (NSScreen*) screenWithMenuBar
{
    return [self screenWithPoint:NSZeroPoint];
}

+ (float) menuScreenHeight
{
    return NSMaxY([[self screenWithMenuBar] frame]);
}

+ (CGPoint) carbonPointFrom: (NSPoint) cocoaPoint
{
    return CGPointMake(cocoaPoint.x, [self menuScreenHeight] - cocoaPoint.y);
}

+ (NSPoint) cocoaPointFrom: (CGPoint) carbonPoint
{
    return NSMakePoint(carbonPoint.x, [self menuScreenHeight] - carbonPoint.y);
}

This works fine even with multiple displays. 即使在多个显示器上也可以正常工作。

The posted code from Apple's code from UIElementInspector turn out to be buggy, in that it doesn't account for the origin of a non-main screen. Apple的UIElementInspector的代码中发布的代码有问题,因为它没有考虑非主屏幕的来源。 The fixed (and refactored) code looks like this: 固定(和重构)的代码如下所示:

+ (CGPoint)carbonScreenPointFromCocoaScreenPoint:(NSPoint)cocoaPoint {
  NSScreen* foundScreen = nil;
  NSRect screenFrame;
  for (NSScreen* screen in [NSScreen screens]) {
    screenFrame = [screen frame];
    if (NSPointInRect(cocoaPoint, screenFrame)) {
      foundScreen = screen;
      break;
    }
  }
  if (! foundScreen) return CGPointMake(0.0, 0.0);
  return CGPointMake(cocoaPoint.x, 
    screenFrame.origin.y + screenFrame.size.height - cocoaPoint.y);
}

Or take Apple's code from UIElementInspector sample project: 或从UIElementInspector示例项目中获取Apple的代码:

+ (CGPoint)carbonScreenPointFromCocoaScreenPoint:(NSPoint)cocoaPoint
{
    NSScreen *foundScreen = nil;
    CGPoint thePoint;

    for (NSScreen *screen in [NSScreen screens])
    {
        if (NSPointInRect(cocoaPoint, [screen frame]))
        {
            foundScreen = screen;
        }
    }

    if (foundScreen)
    {
        CGFloat screenHeight = [foundScreen frame].size.height;
        thePoint = CGPointMake(cocoaPoint.x, screenHeight - cocoaPoint.y - 1);
    }
    else
    {
        thePoint = CGPointMake(0.0, 0.0);
    }

    return thePoint;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM