2

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

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

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

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

4

2 回答 2

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];
    }
}

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

于 2012-09-23T20:09:23.007 回答
0

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

[window setLevel:NSMainMenuWindowLevel];

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

于 2016-03-04T09:05:28.863 回答