2011-05-02 62 views
2

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

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

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) 

奇怪的是,如果我再通过拖动其角调整窗口的大小,完整的标题栏会再次拖动:错误消失。

以前有人看到过这种行为吗?是什么导致它,我该如何解决它。

谢谢。

+0

你的屏幕尺寸是多少? – 2011-05-02 21:37:39

+1

您应该包含调整窗口大小以及调用窗口的代码。也许这个窗口正在一个导致这个bug的地方重新调整大小。 – 2011-05-03 03:11:43

+0

乔希:屏幕的大小似乎没有影响到这一点。我有双显示器(均为1280x1024)和单显示器(1280x1024和1024x768)的错误。 – jslap 2011-05-04 12:49:00

回答

2

NSWindow(和可可中的大多数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:]。

相关问题