如何使用菜单栏在屏幕上打开NSWindow

时间:2013-07-26 17:24:37

标签: cocoa nswindow

我已经看过关于如何将窗口移动到不同的NSScreen的帖子,但这并不是我正在寻找的(并且我不确定答案在任何情况下实际上都是正确的方法) )。

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

现在,我可以根据[[NSScreen screens] objectAtIndex:0]来计算它的帧矩形,这显然是带有菜单栏的窗口。但是1)这看起来像是一个非常简单的黑客,2)不确定它会在菜单栏移动的小牛队中发挥作用。

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

我决定采用另一种方式,但我确实发现,如果你让你的窗口成为NSPanel而不是NSWindow,它似乎会转到主屏幕(带菜单栏)。不知道它会对小牛队做些什么。

答案 2 :(得分:0)

您可以继承from timeit import timeit as t results = [] for size_digits in range(2, 8): size = 10**size_digits # same size a = np.arange(size , dtype=np.int) b = np.arange(size, dtype=np.int) classic = t(lambda: classic_merge(a, b), number=10) new = t(lambda: new_merge(a, b), number=10) results.append((size_digits, classic, new)) if True: text_format = " ".join(["{:<15}"] * 3) print(text_format.format("log10(size)", "Classic", "New")) table_format = " ".join(["{:.5f}"] * 3) for result in results: print(table_format.format(*result)) log10(size) Classic New 2.00000 0.00026 0.00087 3.00000 0.00108 0.00182 4.00000 0.01257 0.01243 5.00000 0.16333 0.12692 6.00000 1.05006 0.49186 7.00000 8.35967 5.93732 并将其框架约束到主屏幕。

NSWindow

- (NSRect)constrainFrameRect:(NSRect)frameRect toScreen:(NSScreen *)screen { return [super constrainFrameRect:frameRect toScreen:[NSScreen mainScreen]]; } 不是指计算机的主屏幕,而是包含当前正在接收键盘事件的窗口的屏幕。

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