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] вокруг вашего кода рисования.

Другие вопросы по тегам