2013-02-21 2 views
3

Я новичок в программировании, объектно-c (и stackoverflow). Я учусь и продвигаюсь очень медленно;), но потом я столкнулся с проблемой, которую Google не смог решить. У меня есть одно окно и NSview, а затем добавлено событие мыши, которое должно нарисовать координаты в моем представлении, но это не так. Самое смешное: он обращается, когда мышь перемещается над окном кнопок моего окна приложений ...Ничья в NSView через событие мыши

- (void)drawRect:(NSRect)dirtyRect { 
    NSPoint imagePos = NSMakePoint(0, 0); 
    NSImage *aImage = [NSImage imageNamed:@"mw_bg01.png"]; 
    [aImage dissolveToPoint:imagePos fraction:1.0]; 
} 
- (void)mouseDown:(NSEvent*)theEvent;{ 
    mouseLoc = [NSEvent mouseLocation]; 
    mousePosX = mouseLoc.x;mousePosY = mouseLoc.y; 
    NSString* mouseString = [NSString stringWithFormat:@"%d", mousePosX]; 
    NSPoint textPoint = NSMakePoint(5, 5); 
    NSMutableDictionary *textAttrib = [[NSMutableDictionary alloc] init]; 
    [textAttrib setObject:[NSFont fontWithName:@"Helvetica Light" size:10] 
       forKey:NSFontAttributeName]; 
    [textAttrib setObject:[NSColor grayColor] forKey:NSForegroundColorAttributeName]; 
    [mouseString drawAtPoint:textPoint withAttributes:textAttrib]; 
} 

Я не знаю, как идти дальше, какие-либо предложения? Благодаря!

+0

Где этот код? Похоже, вы написали обработчик mouseDown. В зависимости от того, где этот код (например, в приложении или в представлении или что-то еще), может быть просто, что когда-либо это будет делегат для кнопки, но не для представления. – podperson

+0

Это в представлении. Я взял обработчик mouseDown, потому что хочу проверить чертеж в моем представлении, а mousemove не вызвал. – fw2601

+0

И: У меня нет кнопок вообще, я имел в виду кнопки с окнами 3 osx ... – fw2601

ответ

5

Вы не должны делать чертеж в методе -mouseDown:. Скорее всего, вы должны сделать весь свой рисунок в -drawRect: (или методы, которые вы вызываете из -drawRect:). Попробуйте что-то вроде этого:

@interface MyView() 
    @property NSPoint lastMousePoint; 
@end 

@implementation MyView 

- (void)drawLastMousePoint 
{ 
    NSString *mouseString = NSStringFromPoint(self.lastMousePoint); 
    NSPoint textPoint = NSMakePoint(5, 5); 
    NSMutableDictionary *textAttrib = [[NSMutableDictionary alloc] init]; 
    [textAttrib setObject:[NSFont fontWithName:@"Helvetica Light" size:10] 
       forKey:NSFontAttributeName]; 
    [textAttrib setObject:[NSColor grayColor] forKey:NSForegroundColorAttributeName]; 
    [mouseString drawAtPoint:textPoint withAttributes:textAttrib]; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSPoint imagePos = NSMakePoint(0, 0); 
    NSImage *aImage = [NSImage imageNamed:@"mw_bg01.png"]; 
    [aImage dissolveToPoint:imagePos fraction:1.0]; 

    [self drawLastMousePoint]; 
} 

- (void)mouseDown:(NSEvent*)theEvent; 
{ 
    self.lastMousePoint = [theEvent locationInWindow]; 
    [self setNeedsDisplay:YES]; 
} 

@end 

Когда вы получаете событие мыши, вы просто сохраняете местоположение мыши. Чертеж выполнен в -drawLastMousePoint, который вы вызываете в своем методе -drawRect:. Поскольку вы знаете, что вам нужно перерисовать в любое время щелчка мыши, вы вызываете -setNeedsDisplay:, чтобы сообщить, что его нужно перерисовать. Обратите внимание, что перерисовка не происходит сразу, скорее, это произойдет в следующий раз через цикл выполнения. Другими словами, вы говорите «эй, что-то изменилось, и мне нужно снова нарисовать содержимое моего представления. Пожалуйста, позвоните -drawRect: снова как можно скорее!»

Другое примечание: +[NSEvent mouseLocation] действительно предназначен для получения текущего местоположения мыши снаружи поток событий. Как правило, в методе -mouseDown: вы вызываете -locationInWindow по адресу NSEvent, переданному в качестве аргумента метода. Если вам нужно преобразовать в локальные/координаты просмотра, вы должны позвонить [self convertPoint:[theEvent locationInWindow] fromView:nil];.

+0

Спасибо. Мне нужно узнать A LOT;) Но одно: когда я вызываю setNeedsDisplay, он тоже рисует mw_bg01.png, правильно? Это было медленно, не так ли? – fw2601

+0

Мы все были совершенно новыми в один момент :). Да, он снова рисует PNG. Вы не должны заранее беспокоиться о том, что это будет медленным, скорее вам следует проверить, достаточно ли он достаточно медленный, чтобы на самом деле это имело значение, и только потом тратить время на изменение способа его работы. В общем, рисование статического PNG на экране происходит довольно быстро. Если вам нужно улучшить производительность, есть несколько вариантов, в том числе: перерисовать только часть представления (см. '-setNeedsDisplayInRect:'), обрабатывать рисование точки мыши в другом представлении, которое является подзором текущего, использовать CALayers и т. д. –

+0

@ fw2601 Это на самом деле не работает для вас? Почему вы не приняли ответа? –

Смежные вопросы