Мое приложение имеет дерево типа 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
Выполнение SetFocus () на дереве (CTreeCtrl) в пределах элемента управленияthe :: OnSelChanged ()
Обработка сообщения ON_CBN_CLOSEUP поля со списком
Или обработка сообщения ON_CBN_SELENDOK поля со списком
Новые результаты -
Мое приложение построено с директивой «Включить визуальные стили».Очевидно, что стиль XP ComCtl32.dll не вызывает этой проблемы, но ComCtl32.dll в Windows Vista и Windows 7 действительно вызывает вышеуказанную проблему.
Не включение визуальных стилей и запуск приложения в Windows 7 делаетне вызывает вышеуказанную проблему.