2011-05-02 20 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:]。