Строка заголовка NSWindow не перетаскивается в правой части - PullRequest
2 голосов
/ 02 мая 2011

У меня есть экземпляр NSWindow, который я изменяю программно (с помощью setFrame). При его создании он имеет размер по умолчанию 50х50. Затем я вызываю 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)

Странная вещь заключается в том, что если я затем изменю размер окна, перетаскивая его угол, полная строка заголовка снова становится перетаскиваемой: ошибка исчезает.

Кто-нибудь видел такое поведение раньше? Что вызывает это и как я могу это исправить.

Спасибо.

1 Ответ

2 голосов
/ 10 мая 2011

NSWindow (и большинство операций с графическим интерфейсом в какао) не являются потокобезопасными.Убедитесь, что вы изменяете размер окна в главном потоке.

Например:

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 executeSelectorOnMainThread: withObject: waitUntilDone:].

...