Win32: Combobox теряет фокус при нажатии на его дочернее окно - PullRequest
0 голосов
/ 15 марта 2019

У меня есть приложение C32 Win32 с основанным на узле графическим интерфейсом, где я создаю динамический комбинированный список с CreateWindowEx, когда пользователь нажимает определенный ключ в графическом интерфейсе. Я хочу, чтобы пользователь мог щелкнуть за пределами поля со списком, чтобы он исчез.

Для этого в настоящее время я уничтожаю комбинированный список внутри уведомления WM_KILLFOCUS о его DlgProc (поэтому любой щелчок вне его уничтожает его). Однако кажется, что уведомление WM_KILLFOCUS отправляется каждый раз, когда одно из его дочерних окон получает фокус. Например, если я щелкну в области редактирования текста в комбобоксе, сам комбобокс теряет фокус, поскольку этот дочерний элемент получает фокус. Учитывая мои настройки, это приводит к удалению поля со списком при щелчке внутри его Rect.

Как я могу предотвратить это поведение? По сути, я хочу иметь возможность обнаруживать, когда что-либо, кроме поля со списком или его дочерних окон, получает фокус, а не просто определять, теряет ли фокус поле со списком.

1 Ответ

0 голосов
/ 15 марта 2019

Вы можете определить, перемещается ли фокус на другой элемент управления из обработчика WM_KILLFOCUS .Это сообщение получает дескриптор

[a] окна, которое получает фокус клавиатуры.

через аргумент wParam .

Используйте CB_GETCOMBOBOXINFO , чтобы получить структуру COMBOBOXINFO , которая содержит дескрипторы окон для всех участвующих окон ( hwndCombo , hwndItem и hwndList * * одна тысяча двадцать-два).Сравнение значения wParam со всеми этими дескрипторами окна позволяет определить, перемещается ли фокус внутри поля со списком или снаружи.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...