![]() |
|
![]() ![]() ![]() |
|
SwallowSPB |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 10.7.2008 Где: Питер Репутация: нет Всего: нет |
Друзья, подскажите, пожалуйста, как открутить флаг CBS_SORT от стилей CComboBox, не пересоздавая элемент заново?
|
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
ModifyStyle(CBS_SORT,0); Не пробовал?
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Наверняка ты создаешь комбобокс в редакторе ресурсов, и там действительно свойство SORT стоит по-умолчанию. Скажи ему FALSE.
-------------------- ... |
|||
|
||||
SwallowSPB |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 10.7.2008 Где: Питер Репутация: нет Всего: нет |
Ставлю CComboBox на диалог простым перетаскиванием из коллекции ЭУ. Можно в свойствах ЭУ тут же выставить false у свойства сортировки. Можно удалить флаг CBS_SORT руками в скриптовом файле ресурсов. Но это до компиляции.
Вопрос, а как его менять во время работы приложения? ModifyStyle(CBS_SORT,0) почему то не работает - это, естествнно, первое, что приходит в голову, потом приходит в голову SetWindowLong. Но это, по крайней мере у меня, не работает. Двойное слово стиля меняется, а элемент тупо гнет свое. Неппонятно. Сообщение окну послать? Но чего-то форма сообщения для CBS_SORT пока в голову не приходит. Да и интуитивно чувствую, что что-то не так. По идее, должна быть функция доступа к свойству. По логике так. Но чего-то я ничего такого не вижу. :( |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Возможно, мы не в силах поменять данный стиль. Как устроен combobox/listbox от нас скрыто и как работает данный флаг мы тоже не знаем ( скорее всего сортировка происходит при вставке нового элемента, а не сортируется список после вставки). Так же в функционале нет функции, изменяющей позицию элемента (как, например, в CListCtrl). Отсюда я делаю вывод, что будет список сортированный или нет, определяется при его создании, после чего изменить данный параметр нельзя. Если нужно менять порядок элементов, то смотри в сторону CListCtrl. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Скорее всего, стиль SORT при создании передается его выпадающему списку. Элементы-то вставляются туда. Когда ты меняешь стиль у комбобокса, на листбокс это ровно никакого влияния не оказывает. Хотя класс выпадающего списка не LISTBOX, а COmboLBox, есть ощущение, что это близкий его родственник. По крайней мере, если посмотреть Спаем стили ComboLBox'ов, то похоже стили там LBS_***. В общем, попробуй поменять стиль выпадающему списку комбобокса - убрать LBS_SORT (именно LBS_*!).
-------------------- ... |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
||||
|
||||
SwallowSPB |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 10.7.2008 Где: Питер Репутация: нет Всего: нет |
Такое впечатление, что строки передаются в ComboLBox или несортированными или уже сортированными, в зависимости от некоторого флага внутри ComboBox, который определяется CBS_SORT до компиляции.
К установке или удалению LBS_SORT ComboLBox у меня оставался совершенно глух. Менялись WS_* флаги, например, WS_BORDER, менялись некоторые LBS_*, например LBS_MULTICOLUMN. Кстати, в спае не показывается ComboLBox окошко, как дочернее ComboBox. Как дочернее показывается только Edit. Можно там как-то посмотреть конкретный ComboLBox конкретного ComboBox? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Увы, нет. Выпадающий список является дочкой десктопа (что понятно, т.к. иначе он бы не мог выпасть за пределы комбобокса). И связанный с ним комбо (а также наоборот, список для комбобокса) в стандартных терминах (parent, owner, child) не отображается. Разумеется, они как-то друг о друге знают, но где-то глубоко внутри себя. Только посмотреть отладчик HWND конкретного ComboLBox и потом искать его Спаем. Это звучит странно. Я правильно понимаю, что ты пытаешься поменять LBS_SORT, а вместо этого изменяются другие стили? Может, ошибся? Кстати, подтверди, что я правильно понимаю твою проблему: даже после снятия флага SORT добавляемые строки помещаются не в те позиции, куда ты хочешь (например, в конец), а порядке сортировки. Т.к. если ты ждешь, что после снятия флага SORT изменить уже существующий порядок строк, то напрасно - они сразу размещаются в соответствующие позиции при вставке. В принципе, некоторые стили (некоторых контролов) нельзя изменить после создания. Например, OWNERDRAW. Но обычно об этом можно найти упоминание в MSDN. А про сорт ничего такого я не видела, дла и странно, с чего бы вдруг. -------------------- ... |
|||
|
||||
SwallowSPB |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 10.7.2008 Где: Питер Репутация: нет Всего: нет |
Я не точно выразился. Устанавливал и убирал флаг LBS_SORT у ComboLBox элемента ComboBox. Добавлял дополнительную строку и смотрел, куда она вставляется. Сортировка не снималась. В обоих случаях новая строка ставилась по алфавиту.
Проблемы нет никакой, просто есть вопрос: можно ли какими-то разумными усилиями убирать и ставить обратно сортировку ComboBox'а во время работы программы? В принципе, можно всегда отключать сортировку до компиляции, а, если надо сортировать, то делать это другими средствами, а в ComboBox вставлять уже готовый порядок. Но ведь если ComboBox предлагает сортировку, как изменяемый элемент стиля, то хотелось бы этим пользоваться, а оно не получается. :( |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Если эксперименты показывают, что поведение SORT нельзя изменить после создания контрола, то, стало быть, так оно и есть. Может даже об этом где-то написано, хотя я не встречала. Вообще известно, что комбобокс - старый и очень кривой контрол (в том смысле, что не соблюдает многие писаные и неписаные соглашения), так что все может быть.
Кстати, для полноты эксперимента, ты не пробовал менять стиль SORT и у комбобокса и у его листбокса? -------------------- ... |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 7 Всего: 9 |
Вот из MSDN. Таки некоторые стили после создания нельзя изменить
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Спасибо, Albor, теперь нашла. Получается, что никакие стили листбокса (кроме NOREDRAW) не могут быть изменены после создания...
-------------------- ... |
|||
|
||||
SwallowSPB |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 10.7.2008 Где: Питер Репутация: нет Всего: нет |
Похоже так оно и есть. Спасибо за ответы.
|
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |