1

你好我是 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

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

4

3 回答 3

3

好吧,您没有任何上下文,系统不知道您要在哪里绘制。如果要在视图或图像上绘图,则必须使用 lockFocus / unlockFocus 对。

所以如果你有一个名为 redView 的出口视图

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

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

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

于 2013-06-22T14:49:29.427 回答
0

applicationDidFinishLaunching:一旦程序“完成”加载资源,就会在程序启动时调用一些背景。

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

底线是:没有为绘制动作发生的位置建立“上下文”。正如d00dle指出的那样,您应该阅读绘图指南

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

于 2013-06-21T18:51:18.800 回答
-1

看看苹果的绘图指南

于 2013-06-21T18:39:27.430 回答