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


Автор: NPU_gh0st 6.12.2007, 11:38

можно ли такое(как на рисунке) сделать через ListView (не через DBGrid), не хочу через DBGrid так как на него у меня нет описания вообще.
прошу сказать возможно ли такое вообще, а если да, то как. Или иной способ динамично менять ширину строк в ListView.
Если нет, то посоветуйте что нибудь. Или подкиньте ссылку на нормальное описалово DBGrid. 

Автор: Greeen 6.12.2007, 15:10
http://www.firststeps.ru/mfc/steps/r.php?367

Автор: NPU_gh0st 7.12.2007, 04:15
Спасибо конечно (дал бы тебе +, да сообщений мало). Но я бы хотел узнать такое вообще возможно на ListView??? так как проект уже напислан с использованием этого элемента, но тут вдруг понадобилось менять ширину строки... Не хотелось бы все переписывать из-за такой мелочи. Что вы мне можете посоветовать??? 

Автор: Earnest 7.12.2007, 09:03
Теоретически можно, разными способами. 1) SetItemImage для каждого итема (картинка - это серая кнопка или серая кнопка со стрелкой). 2) Полный OwnerDraw

Но я бы посоветовала разобраться с гридом. Потому что у тебя именно грид, а не список. И может оказаться, что завтра "вдруг" потребуется еще что-то, что лист-вью стандартно не поддерживает.

Автор: NPU_gh0st 7.12.2007, 11:33
Earnest, спасибо за варианты.
вопросы по твоим советам:
1) а можно будет с помощью картинки менять ширину строки.
2) Полный OwnerDraw (извени но не знаю что это такое еще не встречал) - что это??? может это стиль LVS_OWNERDRAWFIXED, если да то что дальше??? (хотя я думая вряд ли)

минус Grida это то что его прийдется учить искать карту откликов этого элемента (к примеру на перетаскивание, или упорядовачивания по нажатию заголовка) , сделать так чтобы выделялась только строка  и т.д.
А кроме как изменения ширины строки от грида ничего не нужно, может даже и стрелочка не обязательна, главное чтобы размер строки можно было поменять наведя курсор на разделительную линию (как у Grid)

Автор: Earnest 7.12.2007, 14:30
1) Что ты подразумеваешь по шириной строки? Если высоту, то да. Собственно, только с помощью картинок ее и можно изменить (по крайней мере я другого способа не знаю). Однако имей ввиду, что высота строки одинаковая для всех элементов: она определяется высотой картинок в image-list.
А если это размер поля по горизонтали, то вообще не понимаю, в чем проблема: если есть хедер, то меняй себе этот размер сколько угодно, это стандартное поведение. 

2) Да, это стиль LVS_OWNERDRAWFIXED. А дальше ты должен полностью сам отрисовать каждый итем в виртуальной функции DrawItem - учитывая все его состояния, которые туда передаются.

3) Есть еще один способ кастомизации отображения: CustomDraw. Он несколько проще, чем OwnerDraw, т.к. можно выбирать - это я рисую, а здесь пусть Windows парится. Однако, его гибкость гораздо меньше. Выполняется это через обработку сообщения WM_NOTIFY с кодом NM_CUSTMODRAW.

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


Автор: NPU_gh0st 9.12.2007, 11:01
Earnest, спасибо буду искать примеры (если не сложно не кинишь ссылку на опред. пример, где это есть, желательно методов 2 и 3).
1) да это высота
2) и 3) а с их помощью можно будет поменять высоту одной строки??? 
еще раз спасибо

Автор: Earnest 11.12.2007, 18:34
Т.е. ты предлагаешь мне вместо тебя поискать? smile 
Нет у меня готовых ссылок. Помню, что видела на codeproject упоминания, поэтому и советую. Там достаточно простая классификация - можно по контролам искать, или по ключам LVS_OWNERDRAWFIXED или NM_CUSTOMDRAW. 

2) и 3) - нельзя. Высота у всех строк будет одинаковая. Хочешь разную - пользуйся гридом. 

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