MFC C++: setfocus также устанавливает захват?

У меня есть CDialog, который вызывает DoModal(), диалог открывается, все остальное отключено, но почему-то у меня только захват клавиатуры, а не мышь.

Захват мыши все еще находится на последнем элементе, на котором он был.

Если я вызову setfocus перед DoModal, это не сработает, но если я вызову setCapture перед DoModal, он сработает.

Может ли кто-нибудь объяснить это мне?

В чем проблема? Я хочу понять, почему мне нужно вызывать setCapture или releaseCapture перед DoModal (кстати, releaseCapture тоже работает...)


person eladyanai    schedule 20.11.2011    source источник
comment
Я так понимаю, вы имеете в виду SetCapture, а не SetCaption? Если это так, вы можете отредактировать свой пост и исправить это; если нет, то, боюсь, ваш вопрос не имеет для меня смысла. :)   -  person Ken White    schedule 20.11.2011
comment
eladyanni22 - нам действительно нужно больше информации. Вы используете термины «мышь» и «захват клавиатуры» бессмысленным образом (см. ответ Родриго - он прав). Обычно при вызове DoModal никогда не вызываются какие-либо функции захвата. Кроме того, редко вызывается DoModal вне вызывающего контекста (т. е. функция, которая создает экземпляр вашего диалога, а затем вызывает DoModal этого диалога для запуска диалога.   -  person Mordachai    schedule 20.11.2011


Ответы (1)


Нет такой вещи, как «захват клавиатуры». Есть только фокус клавиатуры.

Окно с фокусом клавиатуры получает сообщения, связанные с клавиатурой. Сообщения мыши обычно отправляются в окно сразу под курсором мыши, независимо от фокуса. То есть, если мышь не «захвачена», в этом случае сообщения мыши отправляются в окна, которые захватили мышь, независимо от того, где находится курсор мыши.

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

PS. Из соображений безопасности в Windows на самом деле существует два разных типа захвата мыши:

  • Локальные захваты: сообщения мыши отправляются в окно захвата, только если мышь находится над окном, принадлежащим тому же приложению.
  • Глобальный захват: сообщения мыши отправляются в окно захвата, независимо от того, где находится курсор мыши.

Функция SetCapture создает глобальный захват, только если она вызывается при обработке сообщения WM_?BUTTON_DOWN.

person rodrigo    schedule 20.11.2011
comment
просто я так понимаю... если я сделаю: 'setCapture' в окне, он будет держать фокус ввода мыши внутри моего приложения, пока я не вызову 'releaseCapture' или 'setCapture' в другом окне?? - person eladyanai; 21.11.2011
comment
@ eladyanai22 Нет, фокуса мыши тоже нет. Помните, что есть только фокус клавиатуры и захват мыши. И захват мыши имеет серьезные ограничения безопасности, которые не позволяют использовать его в качестве общего механизма принудительной фокусировки. Захват мыши предназначен в основном для операций перетаскивания (или подобных), которые хотят выйти за пределы исходного окна. Все остальное — путь к разочарованию. - person rodrigo; 24.11.2011