70 votes

Comment créer une fenêtre Cocoa par programme?

Mon application Cocoa a besoin de petites fenêtres générées dynamiquement. Comment puis-je créer par programme des fenêtres Cocoa à l'exécution?

Ceci est ma tentative infructueuse jusqu'à présent. Je ne vois aucun résultat.

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

145voto

Jason Coco Points 52303

Le problème est que vous ne souhaitez pas appeler d'affichage, vous voulez l'appeler, soit makeKeyAndOrderFront ou orderFront selon si oui ou non vous voulez que la fenêtre de devenir la clé de la fenêtre. Vous devriez certainement utiliser NSBackingStoreBuffered.

Ce code permettra de créer votre sans frontières, le bleu de la fenêtre en bas à gauche de l'écran:

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.

Vous pouvez faire de l'expéditeur pour makeKeyAndOrderFront ou orderFront tout ce qui est approprié pour votre situation.

43voto

johndpope Points 1485

Si vous souhaitez instancier l’application par programme sans nib principal dans le fichier main.m, vous pouvez également instancier AppDelegate comme indiqué ci-dessous. Ensuite, dans vos applications prenant en charge les fichiers / YourApp.plist, le fichier de base du fichier principal / MainWindow.xib, supprimez cette entrée. Ensuite, utilisez l'approche de Jason Coco pour attacher la fenêtre à votre méthode init 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;
}
 

7voto

Rich Catalano Points 734

Essayer

 [window makeKeyAndOrderFront:self];
 

au lieu de

 [window display];
 

Est-ce ce que vous visez?

2voto

Steve McLeod Points 19016

C'est ce que je suis venu avec moi-même:

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

Cela affiche une fenêtre bleue. J'espère que c'est l'approche optimale.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X