В Какао, как лучше всего изменить курсор при наведении курсора на круговой обзор?

Что я хочу делать

У меня есть круговой настраиваемый подкласс NSView, и я хочу изменить внешний вид курсора, когда указатель мыши находится над круговыми частями представления, но не над частями прямоугольника представления, выходящими за пределы круга.

Вот иллюстрация. Я бы встроил его в тег изображения, но я слишком новичок, чтобы пользоваться такими замечательными функциями.

Что я знаю на данный момент

Я знаю, как изменить внешний вид курсора через NSCursor. Я думаю, что лучший способ добиться этого для прямоугольного представления - использовать прямоугольник курсора. Я знаю, что могу получать события mouseMoved (и должен отключать их, когда указатель мыши не находится над этим представлением, используя mouseEntered и mouseExited), и у меня есть простой и недорогой способ определить, находится ли точка в интересующей области.

Так в чем же тогда проблема?

Насколько я могу судить, система не отправляет события mouseMoved в представление, которое не является первым респондентом. Следовательно, если я хочу получать события mouseMoved при наведении указателя мыши на мое представление, мне нужно украсть статус firstResponder у того, у кого он в данный момент есть. Если текстовое представление имеет фокус, простое наведение мыши на такое представление украдет его, что просто неприемлемо с точки зрения удобства использования.

Поэтому мой вопрос сводится к следующему: есть ли способ лучше? Могу ли я получать события mouseMoved, не будучи первым респондентом?

Спасибо!

Я бы добавил следующие теги: custom-views mouse-events NSCursor firstResponder Но опять же, я новичок в SA, поэтому не могу.


person Ryan Ballantyne    schedule 23.07.2009    source источник


Ответы (2)


Я думаю, вам просто нужно переопределить метод acceptptsFirstResponder в вашем NSView, чтобы вернуть YES. Если вы этого не сделаете, представление не получит никакой информации о событии.

person Dave DeLong    schedule 23.07.2009
comment
Это действительно так. Спасибо! - person Ryan Ballantyne; 23.07.2009

Это должна быть круглая область? Если любое место в пределах прямоугольных границ представления приемлемо, вы можете использовать прямоугольник курсора.

person Peter Hosey    schedule 23.07.2009
comment
К сожалению, круговой характер района не подлежит обсуждению. К счастью, использование событий mouseMoved для обнаружения попаданий (и их отключение, когда они не нужны с помощью методов mouseEntered и mouseExited) работает достаточно хорошо. - person Ryan Ballantyne; 23.07.2009