Я уверен, что у этого есть простой ответ, который я просто не вижу (проклятие с огромными 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, он должен возвращать только те события, которые произошли в этом окне.