Objective-C Рисование в отдельном окне
Следующий код должен нарисовать прямоугольник на mapWindow NSView. Есть другой файл для моей программы, который использует окно NSView; следовательно, почему я хочу иметь новое окно. Однако прямоугольник не отображается. Любая помощь будет оценена.
@interface mapWindow : NSView {@private NSView* theMapWindow;}
- (void)drawRect:(int)pointx: (int)pointy;
@property (assign) IBOutlet NSView* theMapWindow;
@end
@implementation mapWindow
@synthesize theMapWindow;
- (void)mouseDown:(NSEvent *)event
{
NSPoint point = [event locationInWindow];
//NSLog( @"mouseDown location: (%f,%f)", (float) point.x, (float) point.y);
[self drawRect:point.x:point.y];
}
- (void)drawRect:(int)pointx: (int)pointy
{
NSLog(@"Drawing point at (%d, %d)",pointx, pointy);
NSPoint origin = { pointx,pointy };
NSRect rect;
rect.origin = origin;
rect.size.width = 128;
rect.size.height = 128;
NSBezierPath * path;
path = [NSBezierPath bezierPathWithRect:rect];
[path setLineWidth:4];
[[NSColor whiteColor] set];
[path fill];
[[NSColor grayColor] set];
[path stroke];
[theMapWindow setNeedsDisplayInRect:rect];
}
3 ответа
NSView
"s drawRect:
метод вызывается от вашего имени; Вы должны использовать его для своего чертежа, как описано в разделе "Содержимое чертежа".
@interface mapWindow : NSView {
@private
NSView* theMapWindow;
NSPoint drawPoint;
}
// - (void)drawRect:(int)pointx: (int)pointy;
@property (assign) IBOutlet NSView* theMapWindow;
@property (assign) NSPoint drawPoint;
@end
-
@implementation mapWindow
@synthesize theMapWindow, drawPoint;
- (void)mouseDown:(NSEvent *)event
{
NSPoint point = [event locationInWindow];
NSLog(@"[%@ %@] mouseDown location == %@",
NSStringFromClass([self class]),
NSStringFromSelector(_cmd),
NSStringFromPoint(point));
[self setDrawPoint:point];
[self setNeedsDisplay:YES];
//NSLog( @"mouseDown location: (%f,%f)", (float) point.x, (float) point.y);
//[self drawRect:point.x:point.y];
}
- (void)drawRect:(NSRect)frame {
NSLog(@"Drawing point at %@", NSStringFromPoint(drawPoint));
NSRect drawFrame = NSMakeRect(point.x, point.y, 128.0, 128.0);
[NSBezierPath setDefaultLineWidth:4];
[[NSColor whiteColor] set];
[NSBezierPath fillRect:drawFrame];
[[NSColor grayColor] set];
[NSBezierPath strokeRect:drawFrame];
}
Вы делаете это неправильно. ты не должен звонить drawRect
Вы сами это призовете. заменить вызов drawRect
с setNeedsDisplayInRect
и удалить setNeedsDisplayInRect
от drawRect
метод.
Ваш drawRect:: - это пользовательский метод, а не то же самое, что drawRect:, он не будет вызываться, когда у вас есть представление в качестве текущего контекста, попробуйте бросить [self lockFocus]
,[self unlockFocus]
вокруг вашего кода рисования.