Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > ССomboBox


Автор: Dreamer_0x01 14.9.2005, 09:33
Имеется ССomboBox.

при добавлеии в него элементов "по-простому" типа AddString()строки нумеруются в порядке добавления. (сортировка естественно отключна).

И по GetCurSel и SetCurSel мы определяем/задаем номер текущей выбранной/выбираемой строки.

Можно ли создать "Дырявый" комбобокс, чтобы номера строк в нем были к примеру {0,2,3,5,6,8} ?
И по GetCurSel чтобы возвращались эти числа?

Автор: Coocky 14.9.2005, 10:15
Цитата(Dreamer_0x01 @ 14.9.2005, 09:33)
Можно ли создать "Дырявый" комбобокс, чтобы номера строк в нем были к примеру {0,2,3,5,6,8} ?

Дружище, ты начинаешь меня пугать smile Можно полюбопытствовать-зачем? Может другое решение найдем..
Да, забыл ответить: но вопросом на вопрос- можно ли сделать "дырявый" массив? smile

Автор: Dreamer_0x01 14.9.2005, 10:33
Объясняю.
В зависимости от разных ситуаций в программе мне надо сделать недоступным выбор некоторых пунктов. Задизейблить строку нельзя. Поэтому приходится каждый раз удалять/добавлять строки, причем чтобы нумерация была в нужном мне порядке, приходится сначала все удалить, а потом нужное мне снова добавить.

То есть у меня имеется массив данных МОЯ_СТРУКТУРА М[N];
В зависимости от ситуации мне ладо отображать в комбобоксе только определенные элементы в этой структуре, то есть не все.

И в эти моменты мне приходится вствлять такие вещи:
Код

while(MyComboBox.DeleteString(0));//все удалили
for(int i=0;i<N;i++)
{
if (M[i].мое_условие)MyComboBox.AddString(M[i].строковые_данные);
}


Но это еще ладно, но в случае обработки события выбора списка вычислять элемент, которому принадлежит строка, приходится так:

Код

int cs=MyComboBox.GetCurSel();
int i=-1;//соответствующий элемент массива
while (cs>=0)
{
i++;
if(M[i].мое_условие)сs--;
}
//теперь в i содержится нужный нам индекс массива, соответствующий выбранной строке


Работает, но вот если бы можно было индексировать строки в Комбобоксе, либо делать "дырки" в номерах при создании - было бы гораздо проще smile

Автор: Coocky 14.9.2005, 10:53
Dreamer_0x01
Нормальный подход..
Но я б лучше делал список недоступных строк, а потом проверял при выборе ...
Единственное, чтоб сделал я еще для пользователя-так это маркировку недоступности-это осуществляется перерисовкой Комбобокса, либо подстановкой картинок(галочка для МОЖНО и крестик для НЕЛЬЗЯ) для СomboBoxEx
Добавлено @ 10:58
Код

typedef struct tagDRAWITEMSTRUCT 
{
    UINT        CtlType;        // Тип элемента управления
    UINT        CtlID;        // Идентификатор элемента управления
    UINT        itemID;        // Идентификатор перерисовываемого пункта
    UINT        itemAction;        // Как перерисовывать
    UINT        itemState;        // Состояние после перерисовки
    HWND        hwndItem;        // Дескриптор элемента управления
    HDC         hDC;        // Контекст устройства рисования
    RECT        rcItem;        // Граница рисования
    DWORD       itemData;        // Адрес элемента для перерисовки
} DRAWITEMSTRUCT, NEAR *PDRAWITEMSTRUCT, FAR *LPDRAWITEMSTRUCT;



itemState - состояние после перерисовки:

ODS_CHECKED - Выбран
ODS_DISABLED - Запрещен к выбору.
ODS_FOCUS - Имеет фокус

ODS_GRAYED - Элемент недоступен

ODS_SELECTED - Элемент выбран
ODS_DEFAULT - Элемент по умолчанию

Вот то ,что тебе надо, возможно , что даже и отработает на недоступность smile

Автор: Dreamer_0x01 14.9.2005, 11:25
О, спасибочки. Щас займусь.
А недоступность выбора визуально как-то будет отражена?
Либо все-таки придется крестики-галочки-фиг знает что лепить?
Тогда вопрос - ведь крестик я так понимаю в родителях CWnd имеет? Может свой Паинт для этого CWnd определить можно и там самому что-то нарисовать? (Например, БитМэп влепить) smile

Автор: Coocky 14.9.2005, 11:41
Цитата

Либо все-таки придется крестики-галочки-фиг знает что лепить?
Тогда вопрос - ведь крестик я так понимаю в родителях CWnd имеет? Может свой Паинт для этого CWnd определить можно и там самому что-то нарисовать? (Например, БитМэп влепить) 


Dreamer_0x01
Не дури... smile
Для ComboBoxEx есть список изображений, у тебя будет всего два изображения( крестик и галочка).
Если надо-помогу..
Для ComboBox с перерисовкой нужно создать свой класс, производный отComboBox, и внем переопределить виртуалную функцию DrawItem()
Короче делай, не получится помогу smile
Цитата(Dreamer_0x01 @ 14.9.2005, 11:25)
А недоступность выбора визуально как-то будет отражена?

Думаю, что да ,никогда просто недоступность не делал smile

Автор: Dreamer_0x01 14.9.2005, 14:18
А еще тогда вопрос, ComboBoxEx - насколько "стандартный" контрол...Ну то есть опять я со своей проблемой - а будет ли он корректно работать под Windows95 ?

Автор: Coocky 14.9.2005, 14:46
Судя по МСДН-все ОК!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)