我的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];
答案 0 :(得分:133)
问题是您不想拨打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
的发件人设为适合您情况的发件人。
答案 1 :(得分:37)
附注,如果你想在main.m文件中以编程方式实例化没有主nib的应用程序,你可以如下实例化AppDelegate。然后在您的应用程序支持文件/ YourApp.plist 主nib基本文件/ 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;
}
答案 2 :(得分:6)
尝试
[window makeKeyAndOrderFront:self];
而不是
[window display];
这就是你的目标吗?
答案 3 :(得分:2)
这就是我自己想出来的:
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];
显示蓝色窗口。我希望这是最佳方法。
答案 4 :(得分:0)
将评分最高的答案转换为现代swift(5),可以使您类似于以下内容:
var mainWindow: NSWindow!
...
mainWindow = NSWindow(
contentRect: NSMakeRect(0, 0, 200, 200),
styleMask: [.titled, .resizable, .miniaturizable, .closable],
backing: .buffered,
defer: false)
mainWindow.backgroundColor = .blue
mainWindow.makeKeyAndOrderFront(mainWindow)