Cocoa:单击按钮时NSRectFill不起作用

时间:2013-06-21 18:14:48

标签: objective-c macos cocoa

您好我是Cocoa编程的新手,我遇到了一个关于NSRectFill的问题。

窗口中有一个按钮,以下是我的AppDelegate.m文件:

@implementation LGAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [[NSColor redColor] set];
    NSRectFill(NSMakeRect( 50,50,10,10));
}


- (IBAction)buttonPressed:(id)sender
{
    [[NSColor greenColor] set];
    NSRectFill(NSMakeRect( 60,60,10,10));
}
@end

我期望看到的是应用程序启动时显示的矩形,以及单击按钮后显示的另一个矩形。但是,只显示一个矩形,单击按钮后没有任何反应。 请帮我解决这个问题。谢谢。 此致, ž

3 个答案:

答案 0 :(得分:3)

你没有任何上下文,系统根本不知道你想要绘制的地方。 如果你想在视图或图像上绘图,你必须使用lockFocus / unlockFocus对。

所以,如果您将视图作为名为redView的插座

[redView lockFocus];
[[NSColor redColor] set];
NSRectFill(NSMakeRect( 50,50,10,10));
[redView unlockFocus];

但这是一个非常糟糕的模型,你通常希望你的对象自己绘制。

当调用view drawRect:方法时,你已经有了焦点并且不需要锁定解锁对

答案 1 :(得分:0)

一旦程序“完成”加载资源,在启动程序时会调用一些后台applicationDidFinishLaunching:

但此时,应用程序可能会显示许多窗口和许多视图。仅仅呼叫NSRectFill()是不够的。应用程序不知道在哪里绘制所述矩形(是在这个窗口还是那个?这个NSView或那个)。即使只有一个窗口,它看起来很明显......可能会显示多个您不知道的NSView ......并且对于计算机,您必须非常明确地使用您的命令。

底线是:没有针对绘图操作的位置建立“上下文”。正如 d00dle 指出的那样,您应该阅读Drawing Guide

当调用NSView的drawRect:时,已经设置/定义了上下文(本身)。您可以直接从您的代理人applicationDidFinishLaunching:中提取,但需要定义“上下文”。

答案 2 :(得分:-1)

看看苹果的Drawing Guide