Как повлиять на определение класса окна COMBOBOX - PullRequest
0 голосов
/ 16 марта 2012

У меня есть подкласс CComboBox, который ведет себя по-разному в двух разных контекстах - оба в нативном C ++.В рабочем (тестовом) контексте приложение верхнего уровня было создано с использованием VS2008.В нерабочем случае приложение значительно сложнее и, вероятно, изначально было создано более ранней версией VS.

В случае сбоя элемент управления не отображает раскрывающийся список, а реагирует на элементы управления со стрелками вверх / вниз.Также в случае сбоя он всегда возвращает ноль при запросе с использованием GetMinVisible и всегда возвращает сбой из SetMinVisibleItems.

Похоже, что проблема связана с определением класса окна COMBOBOX.Я сбросил данные, возвращенные с ::GetClassInfoEx в обоих случаях.Помимо адреса wndProc, есть два отличия.Во-первых, в рабочем случае установлен стиль CS_GLOBALCLASS, а в случае сбоя - нет.Также в рабочем случае указывается 4 байта дополнительного окна (cbWndExtra), а в случае сбоя указывается 8 байтов.

Итак, мои вопросы: 1) Какие свойства конфигурации могут повлиять на определение класса окна COMBOBOX? И 2) Как определить правильный wndProc, если я создаю свой собственный класс окна?

РЕДАКТИРОВАТЬ: поведение раскрывающегося окна меняется в зависимости от спецификации свойства character set на вкладке свойства General .Он работает, как и ожидалось, если character set равен unicode, и не работает, если not set.Подкласс поля со списком находится в элементе управления ActiveX, но настройка на уровне приложения, похоже, влияет на класс окна, что приводит к путанице в поле со списком в элементе управления ActiveX.Интересно, что есть другие поля со списком, хотя и в диалоговых окнах, в других местах приложения, которые, кажется, ведут себя очень хорошо.

1 Ответ

0 голосов
/ 16 марта 2012

SetMinVisibleItems использует CB_SETMINVISIBLE и требует comctl32 v6, это ваша подсказка, что это проблема визуальных стилей.

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

...