Какао - события мыши только из определенного окна? Событие KeyDown? - PullRequest
1 голос
/ 04 апреля 2011

Я уверен, что у этого есть простой ответ, который я просто не вижу (проклятие с огромными API-интерфейсами, такими как Cocoa ...). Я работаю с версией образца Sketch от Apple (я думаю, что она была оригинальной, до того, как они добавили материал Accessibility и сделали все это на основе KVO). Я работаю с версией «поцелуя», которая распространяется вокруг, которая добавляет инструменты Безье и многоугольника, пытаясь получить ее так, чтобы цикл отслеживания точек Безье отбрасывал конец пути, если вы нажмете на палитру инструментов во время ее создания. Соответствующие строки для работы с точкой в ​​списке отслеживания таковы:

// SKTGraphicView* view
// Tracking loop
while (1) {
    event = [[view window] nextEventMatchingMask:
(NSLeftMouseDownMask | NSLeftMouseDraggedMask | NSLeftMouseUpMask)];
    point = [view convertPoint:[event locationInWindow] fromView:nil];

Как мне узнать, находится ли эта точка внутри окна документа или нет? Я пытался

BOOL insideView = [view mouse:point inRect:[view bounds]];

, который работает, пока он отслеживает события MouseDragged, но не работает, если я щелкаю в окне палитры инструментов. Из координат, которые выходят из locationInWindow, похоже, что если я щелкаю в отдельном окне, он выделяет точки относительно источника окружающего окна - каким бы оно ни было. Как получить преобразование из «экранных координат» ([location_OnScreen]?), А затем преобразовать в систему координат определенного вида?

Я могу использовать ([окно просмотра] == [окно события]) - но, похоже, это не изменится для событий MouseDragged, когда первоначальный щелчок был внутри окна (но я могу проверить ограничивающий прямоугольник там). Но похоже, что если nextEventMatchingMask: вызывается для конкретного объекта NSWindow, он должен возвращать только те события, которые произошли в этом окне.

1 Ответ

0 голосов
/ 13 апреля 2011

В представлении, а не в окне, переопределение - [(void) mouseDown: (NSEvent *) theEvent]

Затем в переопределении:

получите свою точку зрения таким образом:

- (void) mouseDown: (NSEvent *) theEvent
{
    myPoint = [self convertPoint: [theEvent locationInWindow] fromView: nil]
}

... аналогично для mouseDragged, mouseUp, rightMouse и т. Д.

...