Windows 7 не запускает WM_SETFOCUS при переключении узлов в дереве управления - PullRequest
0 голосов
/ 26 июля 2010

Мое приложение имеет дерево типа CTreeCtrl.Одним из узлов дерева является элемент управления CComboBox, созданный как дочерний элемент этой древовидной структуры.

c_combo-> Create (WS_CHILD | WS_VISIBLE | WS_VSCROLL | CBS_HASSTRINGS | CBS_DROPDOWNLIST, myrect, m_pTree, IDD_OBTC_COMBO);

По сути, дерево ComboBox создается и уничтожается, когда создается щелчок на уничтоженииэто в методе :: OnComboKillFocus () (который в основном обрабатывает сообщение ON_CBN_KILLFOCUS).

Windows не запускает сообщение WM_SETFOCUS при переходе от одного узла дерева к другому UNLESS, когда один из узлов являетсяконтроль, как в нашем случае у нас есть комбобокс.Поэтому, когда я выбираю опцию из выпадающего списка ComboBox, а затем щелкаю левой кнопкой мыши по другому узлу дерева, запускается WM_SETFOCUS.Это поведение в Windows XP.

Однако, по-видимому, в Windows 7, после выбора опции из выпадающего списка ComboBox, щелчок по другому узлу не запускает сообщение WM_SETFOCUS.Таким образом, фокус остается на ComboBox, хотя новый узел выделен!А прокрутка колесика мыши или использование клавиш со стрелками все равно приведет к изменению параметров ComboBox.

Это известная проблема или ожидаемое поведение Windows 7 (отличное от Windows Xp)?

Есть ли способ заставить Windows 7 запустить сообщение WM_SETFOCUS, когда я переключаюсь с одного узла (например, ComboBox) на другой узел?

Чтобы добавить больше деталей -

Мы обрабатываем сообщение TVN_SELCHANGED для элемента управления деревом и обрабатываем сообщение ON_CBN_KILLFOCUS для элемента управления поля со списком, чтобы мы могли выполнить некоторую логику в методе :: OnComboKillFocus (), а затем уничтожить поле со списком и вернуть узел в простой элемент дерева.:: OnSelChanged () получает удар, но не :: OnComboKillfocus ()

По сути, Win 7 уведомляет об изменении выбора узла, но не уведомляет об изменении фокуса (от узла комбинированного блока додругой узел дерева).Я также использовал Spy ++ и подтвердил, что Win 7 не запускает WM_SETFOCUS при выборе (одиночный щелчок) другого узла дерева с первоначальным фокусом на поле со списком (это другой узел того же дерева).Win XP запускает сообщение.

Кроме того, следующие обходные пути помогают Win 7 запускать WM_SETFOCUS

  1. Выполнение SetFocus () на дереве (CTreeCtrl) в пределах элемента управленияthe :: OnSelChanged ()

  2. Обработка сообщения ON_CBN_CLOSEUP поля со списком

  3. Или обработка сообщения ON_CBN_SELENDOK поля со списком

Новые результаты -

Мое приложение построено с директивой «Включить визуальные стили».Очевидно, что стиль XP ComCtl32.dll не вызывает этой проблемы, но ComCtl32.dll в Windows Vista и Windows 7 действительно вызывает вышеуказанную проблему.

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

1 Ответ

1 голос
/ 26 июля 2010

Это ожидаемое поведение.Или лучше: вы используете недокументированное поведение.WM_SETFOCUS отправляется, если элемент управления получает / теряет фокус.Элемент управления tree - это один элемент управления - он может быть построен с использованием других элементов управления, но это не исправлено - и, как вы можете видеть в Win7, он изменился: элемент управления tree теперь представляет собой один элемент управления, а элементы дерева рисуются напрямую, а непостроен из других элементов управления.

используйте вместо этого уведомление TVN_BEGINLABELEDIT .Или, если вы хотите что-то похожее на WM_SETFOCUS, используйте уведомление TVN_ITEMCHANGED и проверьте изменение состояния выбора.

...