2013-03-04 3 views
0

Я пытаюсь нарисовать круг для моего приложения Mac. Кодекс:CGContextRef not drawing

- (void)mouseMoved:(NSEvent*)theEvent { 
    NSPoint thePoint = [[self.window contentView] convertPoint:[theEvent locationInWindow] fromView:nil]; 
    NSLog(@"mouse moved: %f % %f",thePoint.x, thePoint.y); 

    CGRect circleRect = CGRectMake(thePoint.x, thePoint.y, 20, 20); 
    CGContextRef context = [[NSGraphicsContext currentContext] graphicsPort]; 
    CGContextSetRGBFillColor(context, 0, 0, 255, 1.0); 
    CGContextSetRGBStrokeColor(context, 0, 0, 255, 0.5); 
    CGContextFillEllipseInRect(context, CGRectMake(circleRect.origin.x, circleRect.origin.y, 25, 25)); 
    CGContextStrokeEllipseInRect(context, circleRect); 
    [self needsDisplay]; 
} 

- (void)mouseMoved: называется отлично, и я могу видеть правильные координаты х и у в NSLog. Но я не получаю никаких кругов ... на удивление: если я сводит к минимуму мое приложение и снова его открываю (так он «обновляет» NSView) круги отлично нарисованы!

ответ

4

mouseMoved is NOT Право нарисовать что угодно, если только вы не рисуете на экране буфер. Если вы собираетесь рисовать на экране, сохраните thePoint и любые другие необходимые данные, позвоните [self setNeedsDisplay:YES] и нарисуйте метод drawRect:(NSRect)rect.

Кроме того, я не вижу причины использовать CGContextRef, тогда как существует гораздо более «дружественный» NSGraphicsContext. Хотя, это дело вкуса.

Пример кода рисования:

- (void)mouseMoved:(NSEvent*)theEvent { 
    // thePoint must be declared as the class member 
    thePoint = [[self.window contentView] convertPoint:[theEvent locationInWindow] fromView:nil]; 
    [self setNeedsDisplay:YES]; 
} 

- (void)drawRect:(NSRect)rect 
{ 
    NSRect ovalRect = NSMakeRect(thePoint.x - 100, thePoint.y - 100, 200, 200); 
    NSBezierPath* oval = [NSBezierPath bezierPathWithOvalInRect:ovalRect]; 
    [[NSColor blueColor] set]; 
    [oval fill]; 
    [[NSColor redColor] set]; 
    [oval stroke]; 
} 
+0

Хорошо, я сейчас с помощью NSGraphicsContext, который на самом деле является дружественным. Вызывая [self setNeedsDisplay: YES], круг не появляется вообще ... Даже не минимизируя и не открывая. Без [self setNeedsDisplay: YES] Я получаю круги после минимизации и повторного открытия :( –

+1

Я обновил ответ. Используйте пример кода, должен работать как шарм. Каждый раз, когда вы сталкиваетесь с некоторыми проблемами в методе рисования, я бы рекомендуем «начинать с нуля»: нарисуйте что-нибудь, только что-нибудь. Затем проверьте свои методы обновления, код обновления кода (действительно ли вы назначаете переменную? назначаете ли вы локальные переменные или члены?), обновляет представления. найти источник проблемы. – Gobra

+0

Точно то, что я пытался сделать = D Большое спасибо! –