Не приходит сообщение WM_SETFOCUS

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Обрабатываю WM_LBUTTONDOWN, выполняю

Код: Выделить всё

SetFocus(Window);
, сообщение WM_SETFOCUS приходит. Снова обрабатываю WM_LBUTTONDOWN, выполняю

Код: Выделить всё

SendMessage(Window, WM_KILLFOCUS, 0, 0);
, оно приходит, обрабатываю его, выполняю

Код: Выделить всё

DefWindowProc(Window, Message, First, Second);
. Снова обрабатываю WM_LBUTTONDOWN, выполняю

Код: Выделить всё

SetFocus(Window);
, но сообшение WM_SETFOCUS уже не приходит. Что я делаю не так?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Неправильно ты делаешь то, что посылаешь WM_KILLFOCUS вручную.

Ты не обратил внимание, что для отправки сообщения WM_SETFOCUS есть отдельная API SetFocus, а для сообщения WM_KILLFOCUS такой API функции нет. Знаешь почему так? Потому, что WM_KILLFOCUS - это нотификация. Она не должна слаться программистом. Её может генерировать только сама операционная система. Если ты вместо ручной проброски WM_KILLFOCUS вызовешь SetFocus для другого элемента управления, то твой элемент управления потом получит WM_KILLFOCUS уже от операционной системы и это будет правильным. К тому же операционная система правильного заполнит wParam, который при ручной обработке ты не заполняешь, что скорее всего и является причиной того, что фокус у тебя залипает и дальше не хочет даже устанавливаться.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Если ты вместо ручной проброски WM_KILLFOCUS вызовешь SetFocus для другого элемента управления, то твой элемент управления потом получит WM_KILLFOCUS уже от операционной системы и это будет правильным.
Спасибо. Но у меня нет окна, которое должно получить фокус. Его надо просто сбросить, а не переключить на другое окно.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Тогда SetFocus(NULL). Но WM_KILLFOCUS руками никак нельзя звать.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Вот спасибо. Сразу решилась и проблема невозможности преобразовать размеры и положение каретки в процессе обработки WM_SETFOCUS и WM_PAINT.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить