Таб в TreeView

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Таб в TreeView

Сообщение Sirik » 03.06.2008 (Вт) 19:21

на скрине видно проблему с которой я столкнулся
надо как-то отодвинуть правую часть строк на опр. одинаковое растояние
простое использование vbTab не даёт результата (ставится вертикальная черта)

слева список в оригинале, справа то что необходимо получить

если буду идею плиз помогите...

зы. в ручную вычислять самое длинное левое слово нет смысла, ибо шрифт же не Carier...
Вложения
2.JPG
скрин
2.JPG (15.57 Кб) Просмотров: 439

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.06.2008 (Вт) 20:44

1) А это точно TreeView, а не ListView?
1.1) Если да, то надо использовать колонки и subitem-ы.
1.2) Если нет, то я видел гибриды TV и LV. Можно воспользоваться ими. Однако я их не юзал никогда, и не могу говорить, что есть качественные.

2) Можно зающать OWNERDRAW, и рисовать пункты TV самому. Тогда и вторую колонку можно будет нарисовать самому там, где захочется.

3) Можно поставить дереву моноширинный шрифт, и очень легко решить проблему. Тогда надо будет найти самое длинное слово, к его длине прибавить некоторое число пробелов. Потом в эту пробельную строчку ЛСетить значения пунктов, а справа прибавлять значения подпунктов.

4) Можно не ставить дереву моноширинный шрифт, а замерять ширину слов (с помощью TextWidth) и вычислять кол-во пробелов, необходимых на то, чтобы сделать необходимый Indent.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 03.06.2008 (Вт) 21:32

это точно тривью
поподробнее на счет стороннего контрола можно.. сколько не искал, не нашёл(

моноширинный шрифт..м.. единнственный который приходит на ум, так это Currier, но он не подходит, слишком широкий

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.06.2008 (Вт) 21:34

А что скажешь насчёт п.2, п.4?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 03.06.2008 (Вт) 22:04

п.2: я скрин сделал не полный, там есть вложенные списки (с плюс/минус).
да и чесно я не знаю как это реализовать

п.4: ну скажем max TextWidth=2800, сколько нужно поставить пробелов для строки длиной 10 символов? это сложновато, да и таких вычислений надо будет производить много, у меня куча таких таблиц


что ж буду шрифты подбирать(

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.06.2008 (Вт) 22:10

я скрин сделал не полный, там есть вложенные списки (с плюс/минус)

Ну и пусть они (вложенные списки) будут.

да и чесно я не знаю как это реализовать

Вот это другое дело. Но ведь, если захотеть, можно узнать? Например, можно спросить.

п.4: ну скажем max TextWidth=2800, сколько нужно поставить пробелов для строки длиной 10 символов? это сложновато, да и таких вычислений надо будет производить много, у меня куча таких таблиц

Сколько вычислений? (HorizonalIndent - TextWidth(Items(i))) / TextWidth(" ") для каждой строки.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Sirik
Perspicaz
Perspicaz
Аватара пользователя
 
Сообщения: 2280
Зарегистрирован: 19.02.2004 (Чт) 16:09
Откуда: Бердичев, Украина

Сообщение Sirik » 04.06.2008 (Ср) 0:46

по п2. можно по подробнее? ;)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.06.2008 (Ср) 0:52

Нельзя :)

Тут в процессе заглядывания в MSDN выяснилось, что TreeView во отличие от многих остальных вещей (листбоксов, комбобоксов, того же ListView), отображающих пункты, не поддерживает эту фишку (ownerdraw).

Но здесь можно, опять же, пойти на хитрость: использовать ListView и его колонки, а древовидность как раз рисовать с помощью owner draw.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.06.2008 (Ср) 9:34

Тут в процессе заглядывания в MSDN выяснилось, что TreeView во отличие от многих остальных вещей (листбоксов, комбобоксов, того же ListView), отображающих пункты, не поддерживает эту фишку (ownerdraw).

Поддерживает точно так же как Listview, через NM_CUSTOMDRAW.
поподробнее на счет стороннего контрола можно.. сколько не искал, не нашёл(
См. аттач.
Вложения
lvitemtree.rar
(6.58 Кб) Скачиваний: 45
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.06.2008 (Ср) 9:47

У ListView есть стиль LVS_OWNERDRAWFIXED. И при этом ты ловишь сообщение WD_DRAWITEM и радуешься тому, что тебе передают структуру DRAWITEMSTRUCT.

Я искал у TV этот механизм и не обнаружил его.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 04.06.2008 (Ср) 10:02

Наверное WМ_DRAWITEM? Какой-то странный способ, судя по MSDN непосредственно к CommonControls не относящийся.
Код: Выделить всё
If msg= WM_NOTIFY
    получить NMHDR
    if NMHDR.code=NM_CUSTOMDRAW
        получить для listview - NMLVCUSTOMDRAW, для treeview - NMTVCUSTOMDRAW
        select case NM(LV/TV)CUSTOMDRAW.nmcd.dwDrawStage
            case CDDS_PREPAINT, CDDS_ITEMPREPAINT, CDDS_SUBITEM, …
Скачай мой набор CommonControls, там это реализовано для ListView.
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 84

    TopList