我已经看过关于如何将窗口移动到不同的NSScreen的帖子,但这并不是我正在寻找的(并且我不确定答案在任何情况下实际上都是正确的方法) )。
当我调用makeKeyAndOrderFront时,我希望窗口显示在菜单栏的屏幕上 - 因为它是一个About窗口,这意味着用户必须选择About菜单项(窗口不是用户可移动的)和指针就在那儿。当然,默认行为是让窗口显示在具有关键焦点的屏幕上。
现在,我可以根据[[NSScreen screens] objectAtIndex:0]来计算它的帧矩形,这显然是带有菜单栏的窗口。但是1)这看起来像是一个非常简单的黑客,2)不确定它会在菜单栏移动的小牛队中发挥作用。
我错过了一些基本的东西吗?因为它看起来确实如此。
答案 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]];
}
不是指计算机的主屏幕,而是包含当前正在接收键盘事件的窗口的屏幕。
请注意,如果打开然后重新打开,则窗口不会移至其他屏幕。