Здравствуйте NyuK, Вы писали:
NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.
NK>А может есть другой способ, желательно не очень сложный (для чайников)?
данные хранить в массиве (векторе, списке) структур/классов, а в CListCtrl показывать то что нужно показывать
Здравствуйте NyuK, Вы писали:
NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.
NK>А может есть другой способ, желательно не очень сложный (для чайников)?
Есть: каждой строчке можно сопоставить 4-байтовое целое при помощи CListCtrl::SetItemData (или CListCtrl::SetItemDataPtr). Если 4 байтов тебе мало, распределяй для данных структуру и записывай через SetItemDataPtr указатель на неё.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Здравствуйте NyuK, Вы писали:
NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.
NK>А может есть другой способ, желательно не очень сложный (для чайников)?
Данные в контроле вообще лучше не хранить. Если припёрло можно юзать CMap.
А невидимой колонка делается вроде как выставлением ширины в -1.
Попробовал делать ширину колонки -1 (самое простое) — колонки не видно, но текст прорисовывает (прямо по другим колонкам, и мышкой можно растянуть.
С CListCtrl::GetItemData не получилось с ходу, вываливает в отладчик с сообщением, что сработала BreakPoint на таком-то адресе и показывает ASM код.
Сделал через структуру LVITEM, поле lParam — это вроде то же самое.
Правда, боюсь что эти данные понадабятся классу CListCtrl для своих нужд. Не понял пока, но для чего-то нужны.
С CMap, списками и т.п. пока не возился, т.к. проблема еще в том, что здесь надо следить за работой сортировки, иначе все связи нарушатся. А к этому я пока не готов.
Здравствуйте NyuK, Вы писали:
NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.
NK>А может есть другой способ, желательно не очень сложный (для чайников)?
Здравствуйте NyuK, Вы писали:
NK>Такой вопрос. Можно ли в CListCtrl создать невидимую колонку? Она нужна мне для хранения специфичных данных, связанных непосредственно со строкой.
NK>А может есть другой способ, желательно не очень сложный (для чайников)?
Хотя ты вроде проблему уже решил, хотел бы посоветовать тебе более универсальный и надежный способ. Для этого снимаем с CListCtrl все полномочия по хранению информации. Создаем труктурку:
struct MainStruct
{
// Здесь все твои данные, которые ты хранишь в колонках CListCtrl
CString Name;
BYTE Age;
...
// А сюда добавь дополнительную информацию:
DWORD SecretCode;
...
};
Теперь прикрепи списку стиль LVS_OWNERDATA. Если ты используешь CListView перегрузи PreCreateWindow так:
Вот теперь придется помучиться, чтобы все данные, которые ты складывал в CListCtrl положить в m_Data. Но, поверь, оно того стоит!
После всего этого у тебя будет независимый от листа массив, в котором ты сможешь хранить все что захочешь! А чтобы передать листу потребную ему информацию обработай сообщение LVN_GETDISPINFO.
Здравствуйте NyuK, Вы писали:
NK>Сделал через структуру LVITEM, поле lParam — это вроде то же самое. NK>Правда, боюсь что эти данные понадабятся классу CListCtrl для своих нужд. Не понял пока, но для чего-то нужны.
lParam — как раз для разработчика (т.е. для нас).
NK>С CListCtrl::GetItemData не получилось с ходу, вываливает в отладчик с сообщением, что сработала BreakPoint на таком-то адресе и показывает ASM код.
Выделяй память под данные, на которые будет указывать lParam, динамически (т.е. указатель должен быть всегда валиден, по крайней мере пока существует строка в списке). И не забудь потом освободить ее.
Удачи!