Поиск:

Ответ в темуСоздание новой темы Создание опроса
> CComboBox и флаг CBS_SORT, Как открутить стиль CBS_SORT? 
V
    Опции темы
SwallowSPB
Дата 20.12.2009, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 10.7.2008
Где: Питер

Репутация: нет
Всего: нет



Друзья, подскажите, пожалуйста, как открутить флаг CBS_SORT от стилей CComboBox, не пересоздавая элемент заново?
PM MAIL   Вверх
Albor
Дата 20.12.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



ModifyStyle(CBS_SORT,0); Не пробовал?
PM MAIL ICQ   Вверх
Earnest
Дата 21.12.2009, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Наверняка ты создаешь комбобокс в редакторе ресурсов, и там действительно свойство SORT стоит по-умолчанию. Скажи ему FALSE.


--------------------
...
PM   Вверх
SwallowSPB
Дата 22.12.2009, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 10.7.2008
Где: Питер

Репутация: нет
Всего: нет



Ставлю CComboBox на диалог простым перетаскиванием из коллекции ЭУ. Можно в свойствах ЭУ тут же выставить false у свойства сортировки. Можно удалить флаг CBS_SORT руками в скриптовом файле ресурсов. Но это до компиляции. 
Вопрос, а как его менять во время работы приложения? ModifyStyle(CBS_SORT,0) почему то не работает - это, естествнно, первое, что приходит в голову, потом приходит в голову SetWindowLong. Но это, по крайней мере у меня, не работает. Двойное слово стиля меняется, а элемент тупо гнет свое. Неппонятно. 
Сообщение окну послать? Но чего-то форма сообщения для CBS_SORT пока в голову не приходит. Да и интуитивно чувствую, что что-то не так. По идее, должна быть функция доступа к свойству. По логике так. Но чего-то я ничего такого не вижу. :(
PM MAIL   Вверх
Albor
Дата 22.12.2009, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(SwallowSPB @  22.12.2009,  02:04 Найти цитируемый пост)
Двойное слово стиля меняется, а элемент тупо гнет свое.

Возможно, мы не в силах поменять данный стиль. Как устроен combobox/listbox от нас скрыто и как работает данный флаг мы тоже не знаем ( скорее всего сортировка происходит при вставке нового элемента, а не сортируется список после вставки). Так же в функционале нет функции, изменяющей позицию элемента (как, например, в CListCtrl). Отсюда я делаю вывод, что будет список сортированный или нет, определяется при его создании, после чего изменить данный параметр нельзя. Если нужно менять порядок элементов, то смотри в сторону CListCtrl. 
PM MAIL ICQ   Вверх
Earnest
Дата 22.12.2009, 09:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Скорее всего, стиль SORT при создании передается его выпадающему списку. Элементы-то вставляются туда. Когда ты меняешь стиль у комбобокса, на листбокс это ровно никакого влияния не оказывает. Хотя класс выпадающего списка не LISTBOX, а COmboLBox,  есть ощущение, что это близкий его родственник. По крайней мере, если посмотреть Спаем стили ComboLBox'ов, то похоже стили там LBS_***. В общем, попробуй поменять стиль выпадающему списку комбобокса - убрать LBS_SORT (именно LBS_*!).


--------------------
...
PM   Вверх
Albor
Дата 22.12.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Цитата(Earnest @  22.12.2009,  09:00 Найти цитируемый пост)
есть ощущение, что это близкий его родственник

Наверняка это так и есть, иначе с чего бы у комбобокса ф-ция имела имя GetLBText, где LB - ListBox, наверное.
PM MAIL ICQ   Вверх
SwallowSPB
Дата 23.12.2009, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 10.7.2008
Где: Питер

Репутация: нет
Всего: нет



Такое впечатление, что строки передаются в ComboLBox или несортированными или уже сортированными,  в зависимости от некоторого флага внутри ComboBox, который определяется CBS_SORT до компиляции.
К установке или удалению LBS_SORT ComboLBox у меня оставался совершенно глух. Менялись WS_* флаги, например, WS_BORDER, менялись некоторые LBS_*, например LBS_MULTICOLUMN.
Кстати, в спае не показывается ComboLBox окошко, как дочернее ComboBox. Как дочернее показывается только Edit. Можно там как-то посмотреть конкретный ComboLBox конкретного ComboBox? 
PM MAIL   Вверх
Earnest
Дата 23.12.2009, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(SwallowSPB @  23.12.2009,  02:16 Найти цитируемый пост)
Кстати, в спае не показывается ComboLBox окошко, как дочернее ComboBox. Как дочернее показывается только Edit. Можно там как-то посмотреть конкретный ComboLBox конкретного ComboBox?  

Увы, нет. Выпадающий список является дочкой десктопа (что понятно, т.к. иначе он бы не мог выпасть за пределы комбобокса). И связанный с ним комбо (а также наоборот, список для комбобокса) в стандартных терминах (parent, owner, child) не отображается. Разумеется, они как-то друг о друге знают, но где-то глубоко внутри себя. Только посмотреть отладчик HWND конкретного ComboLBox и потом искать его Спаем.

Цитата(SwallowSPB @  23.12.2009,  02:16 Найти цитируемый пост)
К установке или удалению LBS_SORT ComboLBox у меня оставался совершенно глух. Менялись WS_* флаги, например, WS_BORDER, менялись некоторые LBS_*, например LBS_MULTICOLUMN.

Это звучит странно. Я правильно понимаю, что ты пытаешься поменять LBS_SORT, а вместо этого изменяются другие стили? Может, ошибся?

Кстати, подтверди, что я правильно понимаю твою проблему: даже после снятия флага SORT добавляемые строки помещаются не в те позиции, куда ты хочешь (например, в конец), а порядке сортировки.
Т.к. если ты ждешь, что после снятия флага SORT изменить уже существующий порядок строк, то напрасно - они сразу размещаются в соответствующие позиции при вставке. 

В принципе, некоторые стили (некоторых контролов) нельзя изменить после создания. Например, OWNERDRAW. Но обычно об этом можно найти упоминание в MSDN. А про сорт ничего такого я не видела, дла и странно, с чего бы вдруг.



--------------------
...
PM   Вверх
SwallowSPB
Дата 24.12.2009, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 10.7.2008
Где: Питер

Репутация: нет
Всего: нет



Я не точно выразился. Устанавливал и убирал флаг LBS_SORT у ComboLBox элемента ComboBox. Добавлял дополнительную строку и смотрел, куда она вставляется. Сортировка не снималась. В обоих случаях новая строка ставилась по алфавиту.

Проблемы нет никакой, просто есть вопрос: можно ли какими-то разумными усилиями убирать и ставить обратно сортировку ComboBox'а во время работы программы? В принципе, можно всегда отключать сортировку до компиляции, а, если надо сортировать, то делать это другими средствами, а в ComboBox вставлять уже готовый порядок. Но ведь если ComboBox предлагает сортировку, как изменяемый элемент стиля, то хотелось бы этим пользоваться, а оно не получается.  :(


PM MAIL   Вверх
Earnest
Дата 24.12.2009, 09:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Если эксперименты показывают, что поведение SORT нельзя изменить после создания контрола, то, стало быть, так оно и есть. Может даже об этом где-то написано, хотя я не встречала. Вообще известно, что комбобокс - старый и очень кривой контрол (в том смысле, что не соблюдает многие писаные и неписаные соглашения), так что все может быть.
Кстати, для полноты эксперимента, ты не пробовал менять стиль SORT и у комбобокса и у его листбокса? 


--------------------
...
PM   Вверх
Albor
Дата 24.12.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: 7
Всего: 9



Вот из MSDN. Таки некоторые стили после создания нельзя изменить
Цитата

List Box Styles
To create a list box by using the CreateWindow or CreateWindowEx function, use the LISTBOX class, appropriate window style constants, and the following style constants to define the list box. After the control has been created, these styles cannot be modified, except as noted. 

PM MAIL ICQ   Вверх
Earnest
Дата 24.12.2009, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Спасибо, Albor, теперь нашла. Получается, что никакие стили листбокса (кроме NOREDRAW) не могут быть изменены после создания... 


--------------------
...
PM   Вверх
SwallowSPB
Дата 24.12.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 10.7.2008
Где: Питер

Репутация: нет
Всего: нет



Похоже так оно и есть. Спасибо за ответы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0822 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.