Win32 WM_SETCURSOR, WM_MOUSEMOVE всегда в паре? - PullRequest
4 голосов
/ 11 октября 2008

Я работаю над элементом управления Win32. На этом элементе управления могут быть сотни «предметов». Это не окна, а внутренние объекты (например, прямоугольники). В зависимости от положения мыши, я хочу изменить курсор мыши. Это нормально, я могу использовать WM_SETCURSOR.

В то же время, основываясь на перемещении мыши, я хочу отобразить строку состояния, которая показывает подробную информацию об объекте, который в данный момент находится под мышью. Для этого я могу использовать WM_MOUSEMOVE.

Поскольку могут быть сотни предметов, путешествуя по всем из них, чтобы найти один под мышкой, ну, это неэффективно, особенно два раза (один для установки курсора, один для перемещения мыши).

Если коротко, знаете ли вы, если WM_SETCURSOR и WM_MOUSEMOVE ВСЕГДА в паре? В этом случае я могу рассчитать, что я хочу во время WM_SETCURSOR. Другой вариант - установить курсор мыши во время WM_MOUSEMOVE, но, насколько я знаю, это не очень хорошее решение (будет мерцать).

Спасибо

Ответы [ 4 ]

2 голосов
/ 07 апреля 2011

Вы также можете попробовать GetMessagePos() (дает координаты экрана курсора), затем MapWindowPoints() и посмотреть, находится ли он в горячем прямоугольнике или что-то подобное.

2 голосов
/ 11 октября 2008

Самое важное, что ваши обработчики оконных сообщений не должны беспокоиться о хранении или вычислении чего-либо. Вы должны просто сообщить логике вашего приложения, что мышь потенциально находится над новой областью, и заставить ее найти объект (ы). Как только вы найдете горячую область (или более одной), кэшируйте ее (их) границы и проверяйте следующие движения мыши против них. Как только мышь выйдет из одного из них, вы можете перестроить свой список горячих объектов.

Вам не нужно охотиться за горячей областью по всему контролю при каждом движении мыши.

В случае, когда может быть много объектов, разделяющих одну и ту же область, возникает вопрос о z-порядке. Подумайте об этом, когда создаете эти объекты, и управляйте их движением.

Также вам следует подумать об эффективной структуре данных, содержащей координаты объекта, чтобы вам не приходилось проверять каждый отдельный объект каждый раз, когда вы ищете hot one.

Только мои два евро. ;)

2 голосов
/ 11 октября 2008

Несмотря на то, что в настоящее время они могут всегда соответствовать друг другу, вы, вероятно, не можете полагаться на это поведение.

Вы можете установить курсор во время WM_MOUSEMOVE (используя SetCursor), и он не будет мигать, пока (IIRC) вы возвращаете TRUE из WM_SETCURSOR, ничего не делая (т.е. вы едите сообщение), и ваше окно не ' ему назначен курсор класса.

1 голос
/ 11 октября 2008

Есть ли способ кэшировать последний найденный элемент и сократить поиск, если курсор находится в том же месте? Это было бы самое надежное решение.

...