| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Не отображать курсор |
| Автор: Rickert 14.7.2008, 08:07 |
| Есть статик, курсор над которым в определённый момент не должен отображаться. Этот момент - нажатая правая клавиша мыши. На момент, когда кнопка нажимается я выполняю ShowCursor(0), а когда "отжимается" ShowCursor(1). Первый раз всё выполняется правильно и мышь не отображается, а потом отображается, но когда я пытаюсь делать это повторно - она не исчезает. Вопрос: есть ли более грамотный способ не отображать мышь и что это за странное поведение с функцией ShowCursor() ? |
| Автор: Rickert 14.7.2008, 08:33 |
| + к этому, если я "отжимаю" кнопку мыши вне зоны статика - то, есесно, курсор продолжает быть невидимым, но когда я возвращаюсь на статик и нажимаю, а потом отжимаю (уже на нём) - то курсор всё равно не видно, хотя ShowCursor(0) - отрабатывает. |
| Автор: voov 14.7.2008, 09:52 | ||
Попробуй обрабатывать сообщение WM_MOUSEMOVE.
|
| Автор: Earnest 14.7.2008, 13:56 |
| Чтобы все работало корректно, недостаточно отслеживать перемещение мыши: нужно еще обрабатывать ее выход за пределы родительского окна. Перемещение лучше отслеживать с помощью WM_SETCURSOR, а не WM_MOUSEMOVE. А выход за пределы окна - проверка по таймеру. При этом, нужно отслеживать сколько раз курсор был погашен - ровно столько раз его нужно будет включить, чтобы он появился. Или использовать значение, возвращаемое ShowCursor |
| Автор: voov 14.7.2008, 16:54 |
Earnest, зачем? Курсор мы прячем (и держим спрятаным) в OnMouseMove если только он лежит на статике и нажата правая кнопка. Как только курсор покидает статик, мы его сразу показываем. Т.е. вне статика он всегда видим. |
| Автор: Rickert 15.7.2008, 05:11 |
| Курсор не исчезает в том случае, если отключение отображения происходит достаточно быстро: тупо кликал много раз. После этого ShowCursor возвращает (-1) - что означает, что мышь не установлена, как указано в msdn. |
| Автор: voov 15.7.2008, 09:33 |
| покажи код |
| Автор: Rickert 16.7.2008, 04:20 | ||
|
| Автор: Rickert 16.7.2008, 13:01 |
| Я написал по памяти. Код именно такой, ни символом больше. А почему работать не будет? |
| Автор: voov 16.7.2008, 14:38 |
я говорил о проблеме вцелом. говоришь курсор не исчезает... у меня после ShowCursor(0); курсора прячется Добавлено через 5 минут и 56 секунд Возможно дело в том, что ShowCursor(0); вызывается больше 1 раза. |
| Автор: Rickert 16.7.2008, 19:32 |
| voov, читай мои посты внимательно: если быстро нажимать - то механизм ломается. |
| Автор: Earnest 17.7.2008, 08:19 | ||
А как ты узнаешь, что курсор ушел со статика? Думаешь, статик получит маус-мув? Даже если делать это на уровне родительского окна, маус-мув придет только если курсор в его пределах. Всегда можно достаточно быстро дернуть мышь, так что никакй маус-мув не проскочит - ненадежно это. |
| Автор: Rickert 17.7.2008, 10:00 |
| Earnest, можно ограничить движение курсора ClipCursor функция. Но это оффтопик, господа. |
| Автор: voov 17.7.2008, 10:02 |
| Rickert, ты же показал только код, где прячется курсор, а где снова отображается - нет. Могу предположить, что по OnLButtonDown ты его отображаешь. В таком случае, если быстро клацать, то какието события могут неуспеть обработаться и как следствие поведение курсора будет не таким как нужно. Чтобы этого избежать нужно делать проверки. Перед тем как прятать проверить, что курсор отображается. А перед тем как показать проверить, что он спрятан. Earnest, маус-мув обрабатывать на уровне родительского окна. Тогда в пределах этого окна все работает правильно. Если курсор выходит за пределы родительского окна, то он будет отображаться даже, если он был спрятан на статике и родительское окно не успело его показать. Проверял, правда только на модальных окнах. |
| Автор: Earnest 18.7.2008, 11:29 | ||
Если приложение диалоговое, то да. Другими словами, если ты выходишь в окна другого процесса. А если нет - сильно сомневаюсь. То есть даже уверена, что нет - только я это видела как раз на немодальных окнах, но не думаю что с модальными будет иначе - ShowCursor действует на весь процесс (или поток ввода). |
| Автор: voov 18.7.2008, 11:56 | ||||
Проверял так. МДИ приложение. По команде в меню запускаю модальный диалог. При установке фокуса в эдит прячу курсор. Теперь пока мышь над диалогом, курсора нет. Если мышь покидает диалог (находится над МДИ приложением, вызвавшим диалог - тот же процесс), то курсор виден. Навести мышь на диалог - снова курсора нет. При потере фокуса эдитом курсор показывается. |