Как я могу создать окно 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];
Ответы
Ответ 1
Проблема в том, что вы не хотите вызывать отображение, вы хотите вызвать 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, что подходит для вашей ситуации.
Ответ 2
Замечание, если вы хотите запрограммировать программу без основного элемента, в файле main.m/вы можете создать экземпляр AppDelegate, как показано ниже. Затем в ваших приложениях. Поддержка файлов /YourApp.plist. Основной базовый файл nib/MainWindow.xib удаляет эту запись. Затем используйте подход Jason Coco, чтобы прикрепить окно к вашему методу 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;
}
Ответ 3
Попробуйте
[window makeKeyAndOrderFront:self];
вместо
[window display];
Это то, к чему вы стремитесь?
Ответ 4
Вот что я придумал сам:
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];
Отображается синее окно. Надеюсь, это оптимальный подход.