| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > CComboBox и флаг CBS_SORT |
| Автор: SwallowSPB 20.12.2009, 17:10 |
| Друзья, подскажите, пожалуйста, как открутить флаг CBS_SORT от стилей CComboBox, не пересоздавая элемент заново? |
| Автор: Albor 20.12.2009, 22:13 |
| ModifyStyle(CBS_SORT,0); Не пробовал? |
| Автор: Earnest 21.12.2009, 20:13 |
| Наверняка ты создаешь комбобокс в редакторе ресурсов, и там действительно свойство SORT стоит по-умолчанию. Скажи ему FALSE. |
| Автор: SwallowSPB 22.12.2009, 02:04 |
| Ставлю CComboBox на диалог простым перетаскиванием из коллекции ЭУ. Можно в свойствах ЭУ тут же выставить false у свойства сортировки. Можно удалить флаг CBS_SORT руками в скриптовом файле ресурсов. Но это до компиляции. Вопрос, а как его менять во время работы приложения? ModifyStyle(CBS_SORT,0) почему то не работает - это, естествнно, первое, что приходит в голову, потом приходит в голову SetWindowLong. Но это, по крайней мере у меня, не работает. Двойное слово стиля меняется, а элемент тупо гнет свое. Неппонятно. Сообщение окну послать? Но чего-то форма сообщения для CBS_SORT пока в голову не приходит. Да и интуитивно чувствую, что что-то не так. По идее, должна быть функция доступа к свойству. По логике так. Но чего-то я ничего такого не вижу. :( |
| Автор: Albor 22.12.2009, 08:16 |
Возможно, мы не в силах поменять данный стиль. Как устроен combobox/listbox от нас скрыто и как работает данный флаг мы тоже не знаем ( скорее всего сортировка происходит при вставке нового элемента, а не сортируется список после вставки). Так же в функционале нет функции, изменяющей позицию элемента (как, например, в CListCtrl). Отсюда я делаю вывод, что будет список сортированный или нет, определяется при его создании, после чего изменить данный параметр нельзя. Если нужно менять порядок элементов, то смотри в сторону CListCtrl. |
| Автор: Earnest 22.12.2009, 09:00 |
| Скорее всего, стиль SORT при создании передается его выпадающему списку. Элементы-то вставляются туда. Когда ты меняешь стиль у комбобокса, на листбокс это ровно никакого влияния не оказывает. Хотя класс выпадающего списка не LISTBOX, а COmboLBox, есть ощущение, что это близкий его родственник. По крайней мере, если посмотреть Спаем стили ComboLBox'ов, то похоже стили там LBS_***. В общем, попробуй поменять стиль выпадающему списку комбобокса - убрать LBS_SORT (именно LBS_*!). |
| Автор: Albor 22.12.2009, 12:36 |
Наверняка это так и есть, иначе с чего бы у комбобокса ф-ция имела имя GetLBText, где LB - ListBox, наверное. |
| Автор: SwallowSPB 23.12.2009, 01:16 |
| Такое впечатление, что строки передаются в ComboLBox или несортированными или уже сортированными, в зависимости от некоторого флага внутри ComboBox, который определяется CBS_SORT до компиляции. К установке или удалению LBS_SORT ComboLBox у меня оставался совершенно глух. Менялись WS_* флаги, например, WS_BORDER, менялись некоторые LBS_*, например LBS_MULTICOLUMN. Кстати, в спае не показывается ComboLBox окошко, как дочернее ComboBox. Как дочернее показывается только Edit. Можно там как-то посмотреть конкретный ComboLBox конкретного ComboBox? |
| Автор: SwallowSPB 24.12.2009, 01:33 |
| Я не точно выразился. Устанавливал и убирал флаг LBS_SORT у ComboLBox элемента ComboBox. Добавлял дополнительную строку и смотрел, куда она вставляется. Сортировка не снималась. В обоих случаях новая строка ставилась по алфавиту. Проблемы нет никакой, просто есть вопрос: можно ли какими-то разумными усилиями убирать и ставить обратно сортировку ComboBox'а во время работы программы? В принципе, можно всегда отключать сортировку до компиляции, а, если надо сортировать, то делать это другими средствами, а в ComboBox вставлять уже готовый порядок. Но ведь если ComboBox предлагает сортировку, как изменяемый элемент стиля, то хотелось бы этим пользоваться, а оно не получается. :( |
| Автор: Earnest 24.12.2009, 09:19 |
| Если эксперименты показывают, что поведение SORT нельзя изменить после создания контрола, то, стало быть, так оно и есть. Может даже об этом где-то написано, хотя я не встречала. Вообще известно, что комбобокс - старый и очень кривой контрол (в том смысле, что не соблюдает многие писаные и неписаные соглашения), так что все может быть. Кстати, для полноты эксперимента, ты не пробовал менять стиль SORT и у комбобокса и у его листбокса? |
| Автор: Albor 24.12.2009, 16:22 | ||
Вот из MSDN. Таки некоторые стили после создания нельзя изменить
|
| Автор: Earnest 24.12.2009, 16:34 |
| Спасибо, Albor, теперь нашла. Получается, что никакие стили листбокса (кроме NOREDRAW) не могут быть изменены после создания... |
| Автор: SwallowSPB 24.12.2009, 22:55 |
| Похоже так оно и есть. Спасибо за ответы. |