gpt4 book ai didi

objective-c - NSWindow 标题栏右半部分不可拖动

转载 作者:行者123 更新时间:2023-12-03 16:38:57 25 4
gpt4 key购买 nike

我有一个 NSWindow 实例,可以通过编程方式调整大小(使用 setFrame)。创建时,它的默认大小为 50x50。然后我调用 setFrame 将其大小调整为 350x450:一切都很好,我可以随意拖动窗口。然后,在程序的后面部分,我将其大小调整为 1024x768。此时,标题栏唯一可以拖动的部分是前 350 像素:左侧部分。如果我拖动正确的部分,什么也不会发生。就好像标题栏仍然认为窗口具有以前的大小。

更新(添加了设置框架的代码):

void CGLWindowMac::_setSize(int width, int height)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSRect sFrame;

sFrame = [NSWindow contentRectForFrameRect:[mObjcImp frame] styleMask:[mObjcImp styleMask]];

sFrame.origin.y += sFrame.size.height;
sFrame.origin.y -= height;
sFrame.size.height = height;
sFrame.size.width = width;
sFrame = [NSWindow frameRectForContentRect:sFrame
styleMask:[mObjcImp styleMask]];

NSLog(@"Frame Before setsize: cur Size(%f, %f) ", [mObjcImp frame].size.width, [mObjcImp frame].size.height);

[mObjcImp setFrame:sFrame display:YES animate:NO];

NSLog(@"Frame After setsize: cur Size(%f, %f) new val(%d, %d)", [mObjcImp frame].size.width, [mObjcImp frame].size.height, width, height);

// Tell the application that the window size has change.
onSize(width, height);

[pool release];
}

这是输出:

2011-05-04 08:50:47.313 ClientProMac[2461:a0f] Frame Before setsize: cur Size(50.000000, 72.000000) 
2011-05-04 08:50:47.340 ClientProMac[2461:a0f] Frame After setsize: cur Size(350.000000, 472.000000) new val(350, 450)
2011-05-04 08:50:49.148 ClientProMac[2461:7003] Frame Before setsize: cur Size(350.000000, 472.000000)
2011-05-04 08:50:49.160 ClientProMac[2461:7003] Frame After setsize: cur Size(1024.000000, 790.000000) new val(1024, 768)

奇怪的是,如果我然后通过拖动窗口的角来调整窗口大小,完整的标题栏将再次变得可拖动:错误消失。

以前有人见过这种行为吗?是什么原因造成的以及如何解决它。

谢谢。

最佳答案

NSWindow(以及 cocoa 中的大多数 GUI 操作)不是线程安全的。确保在主线程上调整窗口大小。

例如:

NSRect frame = NSMakeRect(42, 42, 420, 420);
dispatch_sync(dispatch_get_main_queue(), ^{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[window setFrame:frame];
[pool release];
});

如果需要向后兼容并且不想使用GCD,可以使用-[NSObject PerformSelectorOnMainThread:withObject:waitUntilDone:]。

关于objective-c - NSWindow 标题栏右半部分不可拖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5860932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com