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

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 lors de l'exécution?

C'est ma tentative de non-travail jusqu'à présent. Je ne vois pas de raison que ce soit.

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];
61
demandé sur Sjoerd 2008-11-24 17:21:22

4 réponses

Le problème est que vous ne voulez pas appeler display, vous voulez appeler makeKeyAndOrderFront ou orderFront selon que vous voulez ou non que la fenêtre devienne la fenêtre principale. Vous devriez également probablement utiliser NSBackingStoreBuffered.

Ce code va créer votre fenêtre bleue sans bordure 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 l'expéditeur pour makeKeyAndOrderFront ou orderFront Tout ce qui est approprié pour votre situation.

130
répondu Jason Coco 2018-03-16 21:09:43

Une note de côté, si vous voulez instancier par programmation l'application sans une plume principale, dans le principal.m fichier / vous pouvez instancier L'AppDelegate comme ci-dessous. Ensuite, dans vos applications supportant les fichiers / YourApp.plist fichier de base de la plume principale / MainWindow.XIB supprimer cette rubrique. Ensuite, utilisez L'approche de Jason Coco pour attacher la fenêtre dans votre méthode D'initialisation 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;
}
36
répondu johndpope 2013-05-13 17:07:09

Essayez

[window makeKeyAndOrderFront:self]; 

Au Lieu de

[window display];

C'est ce que vous visez?

6
répondu Rich Catalano 2008-11-24 14:39:33

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

Affiche une fenêtre bleue. J'espère que c'est la meilleure approche à adopter.

2
répondu Steve McLeod 2008-11-24 14:38:57