Как мне создать окно Какао программно? - PullRequest
62 голосов
/ 24 ноября 2008

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

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

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];

Ответы [ 4 ]

133 голосов
/ 24 ноября 2008

Проблема в том, что вы не хотите звонить display, вы хотите позвонить либо 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 в зависимости от ситуации.

37 голосов
/ 12 мая 2011

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

#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;
}
6 голосов
/ 24 ноября 2008

Попробуйте

[window makeKeyAndOrderFront:self]; 

вместо

[window display];

Это то, к чему ты стремишься?

2 голосов
/ 24 ноября 2008

Вот что я придумала сама:

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];

Это отображает синее окно. Я надеюсь, что это оптимальный подход.

...