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];
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.
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;
}
Essayez
[window makeKeyAndOrderFront:self];
Au Lieu de
[window display];
C'est ce que vous visez?
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.