【问题标题】:How do you open an NSWindow on the screen with the menu bar如何使用菜单栏在屏幕上打开 NSWindow
【发布时间】:2013-07-26 17:24:37
【问题描述】:

我已经看过关于如何将窗口移动到不同 NSScreen 的帖子,但这并不是我想要的(而且我不确定在任何情况下这些答案是否是正确的方法)。

当我调用 makeKeyAndOrderFront 时,我希望窗口与菜单栏一起显示在屏幕上 - 因为它是一个 About 窗口,这意味着用户必须选择 About 菜单项(该窗口不是用户可移动的)和指针会在那里。当然,默认行为是让窗口显示在具有关键焦点的屏幕上。

现在,我可以根据 [[NSScreen screen] objectAtIndex:0] 计算它的框架矩形,这显然是带有菜单栏的窗口。但是 1) 这似乎是一个 hack,应该是非常简单的事情;2) 不确定这是否适用于菜单栏将四处移动的 Mavericks。

我错过了一些基本的东西吗?因为它确实看起来像。

【问题讨论】:

    标签: cocoa nswindow


    【解决方案1】:

    由于您确定窗口将由鼠标 aciton 创建,因此您可以找到包含鼠标指针的屏幕,而不是寻找菜单栏:

    NSScreen * mouseScreen = nil;
    NSPoint mousePoint = [NSEvent mouseLocation];
    for( NSScreen * screen in [NSScreen screens] ){
        if( NSMouseInRect(mousePoint, [screen frame], NO) ){
            mouseScreen = screen;
            break;
        }
    }
    

    【讨论】:

    • 这可能会解决问题 #2 - 但这并不是问题的真正答案:是否有一些内置方法可以做到这一点(与手动移动窗口相比)。
    • 是的,我确实忽略了那部分。据我所知,没有办法直接指定窗口的屏幕。你只需要改变它的框架。
    【解决方案2】:

    我决定采用另一种方式,但我确实发现,如果您将窗口设为 NSPanel 而不是 NSWindow,它似乎会进入主屏幕(带有菜单栏)。但不确定它会对小牛队产生什么影响。

    【讨论】:

      【解决方案3】:

      您可以继承NSWindow 并将其框架限制在主屏幕上。

      - (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen {
          return [super constrainFrameRect:frameRect toScreen:[NSScreen mainScreen]];
      }
      

      [NSScreen mainScreen] 不是指计算机主屏幕,而是包含当前正在接收键盘事件的窗口的屏幕。

      请注意,如果打开然后重新打开,窗口不会移动到其他屏幕。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-10
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多