Objective-C Рисование в отдельном окне - PullRequest
0 голосов
/ 05 июня 2011

Следующий код должен рисовать прямоугольник на 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 ]

2 голосов
/ 05 июня 2011

Вы делаете это неправильно.Вы не должны звонить drawRect сами, это будет называться для вас.замените вызов drawRect на setNeedsDisplayInRect и удалите setNeedsDisplayInRect из метода drawRect.

1 голос
/ 05 июня 2011

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];
}
1 голос
/ 05 июня 2011

ваш drawRect :: - это пользовательский метод, который отличается от drawRect:, он не будет вызываться, когда у вас в качестве текущего контекста будет ваше представление, попробуйте добавить [self lockFocus], [self unlockFocus] вокруг вашего кода рисования.

...