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