2012-03-15 3 views
0

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

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

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

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

EDIT: поведение раскрывающегося списка изменяется со спецификацией свойства character set в поле Общие сведения вкладка свойств. Он работает, как и ожидалось, если character set - unicode и не работает, когда он not set. Подкласс combo box находится в элементе управления ActiveX, но настройка на уровне приложения, по-видимому, влияет на класс окна, что заставляет испортить поле со списком в элементе управления ActiveX. Интересно, что есть и другие комбинированные поля, хотя и в диалоговом окне, в другом месте приложения, которое, кажется, ведет себя отлично.

+0

В обоих приложениях используется ComCtrl v6 aka Visual Styles? – Anders

+0

И инициализируют общие элементы управления, поэтому я думаю, что это означает «да». – rlduffy

+1

Я говорю о зависимости в манифесте, вы можете проверить с помощью http://weblogs.asp.net/kennykerr/archive/2007/07/10/manifest-view-1-0.aspx – Anders

ответ

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^