2008-11-24 5 views
59

Для моего приложения Cocoa нужны небольшие динамически созданные окна. Как я могу программно создавать окна Cocoa во время выполнения?Как создать окно Cocoa программно?

Это моя неработающая попытка. Я не вижу никакого результата.

NSRect frame = NSMakeRect(0, 0, 200, 200); 
NSUInteger styleMask = NSBorderlessWindowMask; 
NSRect rect = [NSWindow contentRectForFrameRect:frame styleMask:styleMask]; 

NSWindow * window = [[NSWindow alloc] initWithContentRect:rect styleMask:styleMask backing: NSBackingStoreRetained defer:false]; 
[window setBackgroundColor:[NSColor blueColor]]; 
[window display]; 

ответ

125

Проблема заключается в том, что вы не хотите вызвать дисплей вы хотите звонить либо makeKeyAndOrderFront или orderFront в зависимости от того, хотите ли вы или нет окно, чтобы стать ключевым окном. Вероятно, вы также должны использовать NSBackingStoreBuffered.

Этот код будет создать без полей, синее окно в нижней левой части экрана:

NSRect frame = NSMakeRect(0, 0, 200, 200); 
NSWindow* window = [[[NSWindow alloc] initWithContentRect:frame 
        styleMask:NSBorderlessWindowMask 
        backing:NSBackingStoreBuffered 
        defer:NO] autorelease]; 
[window setBackgroundColor:[NSColor blueColor]]; 
[window makeKeyAndOrderFront:NSApp]; 

//Don't forget to assign window to a strong/retaining property! 
//Under ARC, not doing so will cause it to disappear immediately; 
// without ARC, the window will be leaked. 

Вы можете сделать отправителем makeKeyAndOrderFront или orderFront то, что соответствует вашей ситуации.

+9

Просто любопытно человеку, который нашел мой ответ/так/бесполезно, чтобы его проголосовать ... почему это бесполезно? – 2008-11-24 15:24:14

+31

Не беспокойтесь о нисходящем избирателе Джейсоне. Я нашел ваш ответ полезным. – 2008-11-24 15:35:15

2

Это то, что я придумал сам с собой:

NSRect frame = NSMakeRect(100, 100, 200, 200); 
NSUInteger styleMask = NSBorderlessWindowMask; 
NSRect rect = [NSWindow contentRectForFrameRect:frame styleMask:styleMask]; 
NSWindow * window = [[NSWindow alloc] initWithContentRect:rect styleMask:styleMask backing: NSBackingStoreBuffered defer:false]; 
[window setBackgroundColor:[NSColor blueColor]]; 
[window makeKeyAndOrderFront: window]; 

Это показывает синее окно. Надеюсь, это оптимальный подход.

+3

Не забудьте освободить его и назначить его к сильной или удерживающей собственности (последнее особенно важно в АРК: http://stackoverflow.com/q/7198562/30461). – 2011-08-26 06:39:24

6

Попробуйте

[window makeKeyAndOrderFront:self]; 

вместо

[window display]; 

Это то, что вы стремитесь?

34

Замечание, если вы хотите запрограммировать программу без основного наконечника, в файле main.m/вы можете создать экземпляр AppDelegate, как показано ниже. Затем в ваших приложениях Поддержка файлов/YourApp.plist Основной файл базового файла/MainWindow.xib удалите эту запись. Затем используйте подход Джейсона Коко, чтобы прикрепить окно к вашему методу initDeslegates.

#import "AppDelegate.h": 

int main(int argc, char *argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    [NSApplication sharedApplication]; 

    AppDelegate *appDelegate = [[AppDelegate alloc] init]; 
    [NSApp setDelegate:appDelegate]; 
    [NSApp run]; 
    [pool release]; 
    return 0; 
} 
Смежные вопросы