web-dev-qa-db-ja.com

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];
62
Steve McLeod

問題は、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の送信者は、状況に応じて適切に作成できます。

135
Jason Coco

補足事項として、メインnibなしでアプリケーションをプログラムでインスタンス化する場合は、main.mファイルで、次のようにAppDelegateをインスタンス化できます。次に、アプリのSupporting Files/YourApp.plist Main nib base file/MainWindow.xibこのエントリを削除します。次に、Jason Cocoのアプローチを使用して、AppDelegates initメソッドにウィンドウをアタッチします。

#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;
}
39
johndpope

試してみる

[window makeKeyAndOrderFront:self]; 

の代わりに

[window display];

それはあなたが目指していることですか?

6
Rich Catalano

これは私が自分で思いついたものです:

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

これにより、青いウィンドウが表示されます。これが最適なアプローチであることを願っています。

2
Steve McLeod