拖动NSWindow高于菜单栏

时间:2012-09-23 18:24:22

标签: objective-c macos cocoa nswindow

我创建了一个名为Uberlayer的应用。用户可以使用此单一用途的Mac应用程序在其他应用程序之上叠加图像。

我正在使用setMovableByWindowBackground来启用拖动整个窗口的背景。

我想做一点改进,因为应用程序现在你不能拖动窗口高于菜单栏,这可能有点烦人。使用普通窗口,我可以想象将它锁定到菜单栏是一件好事,但对于这个用例,能够将它拖得更高是一件好事。

任何人都知道如何更改此默认窗口行为?

2 个答案:

答案 0 :(得分:3)

而是使用-setMovableByWindowBackground:覆盖-mouseDown:这样的事件:

- (void)mouseDown:(NSEvent *)event
{
    NSPoint originalMouseLocation = [window convertBaseToScreen:[event locationInWindow]];
    NSRect originalFrame = [window frame];

    while (YES)
    {
        NSEvent *newEvent = [window nextEventMatchingMask:(NSLeftMouseDraggedMask | NSLeftMouseUpMask)];

        if ([newEvent type] == NSLeftMouseUp)
        {
            break;
        }

        NSPoint newMouseLocation = [window convertBaseToScreen:[newEvent locationInWindow]];
        NSPoint delta = NSMakePoint(
                                    newMouseLocation.x - originalMouseLocation.x,
                                    newMouseLocation.y - originalMouseLocation.y);

        NSRect newFrame = originalFrame;

        newFrame.origin.x += delta.x;
        newFrame.origin.y += delta.y;

        [window setFrame:newFrame display:YES animate:NO];
    }
}

**不要忘记隐藏窗口的标题栏(选择窗口 - >转到属性检查器 - >取消选中标题栏 )因为它的窗口不能高于菜单栏。或者其他解决方案是创建无边框窗口。

答案 1 :(得分:0)

我只是加入贾斯汀的答案。您需要在使用Justin的-mouseDown:代码时设置其级别。

[window setLevel:NSMainMenuWindowLevel];

如果窗口级别低于NSMainMenuWindowLevel,则无效。 如果您希望窗口位于状态栏上方,可以将其设置为NSStatusWindowLevel