Как создать окно Cocoa программным способом?
моему приложению Cocoa нужны небольшие динамически генерируемые окна. Как программно создать Cocoa windows во время выполнения?
Это моя неработающая попытка до сих пор. Я не вижу никакого результата.
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 ответов
проблема в том, что вы не хотите называть 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
- все, что подходит для вашей ситуации.
Примечание, Если вы хотите программно создать экземпляр приложения без основного пера, в основном.M файл / вы можете создать экземпляр AppDelegate, как показано ниже. Затем в приложениях, поддерживающих файлы / YourApp.файл plist основной базовый файл наконечника / MainWindow.xib удалить эту запись. Затем используйте подход Джейсона Коко, чтобы прикрепить окно в методе 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;
}
попробовать
[window makeKeyAndOrderFront:self];
вместо
[window display];
это то, к чему вы стремитесь?
вот что я придумал сам:
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];
появляется синее окно. Надеюсь, это оптимальный подход.