什么是正确的方法来计算点击鼠标的点

时间:2015-05-28 12:56:08

标签: macos nsview nspoint

我的应用程序中有一个NSView的自定义子类。 我想知道视图中的确切点,相对于它的原点,用鼠标点击。 (即,不是相对于窗口原点,而是相对于自定义视图原点)。

我一直使用这个,它完美地运作了:

-(void)mouseDown:(NSEvent *)theEvent
{
    NSPoint screenPoint = [NSEvent mouseLocation];
    NSPoint windowPoint = [[self window] convertScreenToBase:screenPoint];
    NSPoint point = [self convertPoint:windowPoint fromView:nil];

    _pointInView = point;

    [self setNeedsDisplay:YES];
}

但现在我收到一条警告,即 convertScreenToBase 已被弃用,而是使用 convertRectFromScreen 。但是我无法从convertRectFromScreen获得相同的结果,无论如何,我对某一点感兴趣,而不是直接!

我应该使用什么作为上述弃用代码的正确替代品? 提前谢谢!

3 个答案:

答案 0 :(得分:4)

您的代码中的这一行:

    NSPoint screenPoint = [NSEvent mouseLocation];

获取鼠标光标与事件流不同步的位置。这不是你目前正在处理的事件的位置,这是过去很短的时间;它现在是光标的位置,这意味着你可能会跳过一些重要的东西。您应该几乎总是使用与事件流同步的位置。

为此,请使用您的方法收到的theEvent参数。 NSEvent具有locationInWindow属性,该属性已被转换为接收它的窗口的坐标。这样就无需转换它。

    NSPoint windowPoint = [theEvent locationInWindow];    

将窗口位置转换为视图坐标系的代码很好。

答案 1 :(得分:3)

我制作了一个带窗口的示例项目,并测试了“旧”和新的场景。结果在两种情况下都是相同的。

您必须再做一个步骤:使用screenPoint作为原点创建一个简单的rect。然后使用新的,返回的rect的原点。

这是新代码:

-(void)mouseDown:(NSEvent *)theEvent
{
    NSPoint screenPoint = [NSEvent mouseLocation];
    NSRect rect = [[self window] convertRectFromScreen:NSMakeRect(screenPoint.x, screenPoint.y, 0, 0)];

    NSPoint windowPoint = rect.origin;
    NSPoint point = [self convertPoint:windowPoint fromView:nil];

    _pointInView = point;

    [self setNeedsDisplay:YES];
}

我希望我能帮到你!

答案 2 :(得分:2)

我找到了解决方案:

if (order.Equals("left"))
{
    line.Add(img1);
    Grid.SetColumn(img1, 0);
    Grid.SetLine(img1, 0);
    Map.Children.Add(img1);
}
else if (order.Equals("left"))
{
    line.Add(img1);
    Grid.SetColumn(img1, 1);
    Grid.SetLine(img1, 0);
    Map.Children.Add(img1);
}
// and so on