TreeView Control с многострочными элементами
От: sharcUs Беларусь http://sharcus.blogspot.com/
Дата: 22.09.06 14:12
Оценка:
Естьу меня дерево, элементами которого являются строки. Дерево имеет несколько уровней вложенности. Всего порядка 4-5 уровней таких вот строк. строки некоторых уровней бывают настолько большими, что не помещаются в видимую область дерева, сколько бы я его не растягивал.
Поэтому потребовалось сделать так, что бы элементы дерева были многострочными — то что не помещается в видимой области контрола — переносится на следующую строку и тд.
Поиски такого ноу-хау во всемирной паутине не увенчались успехом. Не помогли мне ни безызвестные ресурсы посвященные данной тематике, ни многочисленные форумы разработчиков, которые до этого меня неоднократно выручали.
Поэтому было решено закатать рукава и самому взяться за это великое дело. Ознакомившись с предметом работы было принято решение отрисовать все самому с помощью Custom Draw. Для решения проблемы было принято решение обрабатывать CDDS_ITEMPREPAINT и возвращать после обработки CDRF_SKIPDEFAULT. Но разобравшись как все там работает, пришел к выводу что не все так гладко как хотелось бы. Возникла проблема переопределения области экрана, отводимой элементу (RECT).
Как я ни пытался повлиять на нее ничего у меня не получилось. Но в это время на глаза мне попалось сообщение LB_SETITEMHEIGHT, которое частично решило проблему.
И в итоге вот что у меня получилось: Беру самую длинную сроку, текущий размер окна дерева, в соответсвии с настройками шрифтов системы определяю в сколько строк поместилась бы моя строка. Потом с помощью LB_SETITEMHEIGHT устанавливаю высоту элемента и уже при обработке CDDS_ITEMPREPAINT разбиваю длинную строку и рисую (DrawText) текст по частям.

Вот такой механизм. Приводит к тому что элементы с короткими строками выглядят очень коряво. Место в окне дерева используется крайне нерационально. С очень большими строками элементы выглядят очень громоздко и визуально пугают пользователей.
Не мог бы кто подсказать метод получше, как быть в сложившейся ситуации или прокомментировать мои действия с целью улучшения элемента управления
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Картинки в студию! :)
От: ndemia Россия http://ndemia.com
Дата: 22.09.06 14:21
Оценка:
Скриншоты в смысле.
А то так одной фантазией сложно вообразить, что именно там коряво

(в конце концов Word в режиме структуры документа ничего, не страшный)
Re[2]: Картинки в студию! :)
От: sharcUs Беларусь http://sharcus.blogspot.com/
Дата: 25.09.06 06:11
Оценка:
вот приблизительный скрин, того что получилось.
в конечном приложении текста будет больше, и уровней тоже...
рамку в принципе можно убрать


N>Скриншоты в смысле.

N>А то так одной фантазией сложно вообразить, что именно там коряво

N>(в конце концов Word в режиме структуры документа ничего, не страшный)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: TreeView Control с многострочными элементами
От: _BOBAH_ Россия  
Дата: 25.09.06 09:53
Оценка:
Здравствуйте, sharcUs, Вы писали:

U>Естьу меня дерево, элементами которого являются строки. Дерево имеет несколько уровней вложенности. Всего порядка 4-5 уровней таких вот строк. строки некоторых уровней бывают настолько большими, что не помещаются в видимую область дерева, сколько бы я его не растягивал.

U>Поэтому потребовалось сделать так, что бы элементы дерева были многострочными — то что не помещается в видимой области контрола — переносится на следующую строку и тд.
U>Поиски такого ноу-хау во всемирной паутине не увенчались успехом. Не помогли мне ни безызвестные ресурсы посвященные данной тематике, ни многочисленные форумы разработчиков, которые до этого меня неоднократно выручали.
U>Поэтому было решено закатать рукава и самому взяться за это великое дело. Ознакомившись с предметом работы было принято решение отрисовать все самому с помощью Custom Draw. Для решения проблемы было принято решение обрабатывать CDDS_ITEMPREPAINT и возвращать после обработки CDRF_SKIPDEFAULT. Но разобравшись как все там работает, пришел к выводу что не все так гладко как хотелось бы. Возникла проблема переопределения области экрана, отводимой элементу (RECT).
U>Как я ни пытался повлиять на нее ничего у меня не получилось. Но в это время на глаза мне попалось сообщение LB_SETITEMHEIGHT, которое частично решило проблему.
U>И в итоге вот что у меня получилось: Беру самую длинную сроку, текущий размер окна дерева, в соответсвии с настройками шрифтов системы определяю в сколько строк поместилась бы моя строка. Потом с помощью LB_SETITEMHEIGHT устанавливаю высоту элемента и уже при обработке CDDS_ITEMPREPAINT разбиваю длинную строку и рисую (DrawText) текст по частям.

U>Вот такой механизм. Приводит к тому что элементы с короткими строками выглядят очень коряво. Место в окне дерева используется крайне нерационально. С очень большими строками элементы выглядят очень громоздко и визуально пугают пользователей.

U>Не мог бы кто подсказать метод получше, как быть в сложившейся ситуации или прокомментировать мои действия с целью улучшения элемента управления

Я думаю тебе нужен "деревянный" контрол на основе ListView и такой я точно где то видел, где вот только не припомню, а вот на его основе уже можно сделать то что тебе нужно без особых проблем потомучто насколько я помню ListView позволяет делать итемы разной высоты
_BOBAH_, ICQ# 306404574
Muzik:HIM — Beautiful
Re[2]: TreeView Control с многострочными элементами
От: 2bas Украина  
Дата: 25.09.06 10:24
Оценка:
Здравствуйте, _BOBAH_, Вы писали:

_BO>Я думаю тебе нужен "деревянный" контрол на основе ListView и такой я точно где то видел, где вот только не припомню, а вот на его основе уже можно сделать то что тебе нужно без особых проблем потомучто насколько я помню ListView позволяет делать итемы разной высоты


TVirtualStringTree — правда он для Делфи и Билдера.
но думаю если ролазить по инету то можно найти
и для вижуала.
Re: TreeView Control с многострочными элементами
От: DimaR Ниоткуда  
Дата: 26.09.06 07:02
Оценка:
Попробуй DHTML
while(work){ money++; time--; if(!time){ die_happy();} }
Re[3]: TreeView Control с многострочными элементами
От: _BOBAH_ Россия  
Дата: 26.09.06 07:02
Оценка:
Здравствуйте, 2bas, Вы писали:

2>Здравствуйте, _BOBAH_, Вы писали:


_BO>>Я думаю тебе нужен "деревянный" контрол на основе ListView и такой я точно где то видел, где вот только не припомню, а вот на его основе уже можно сделать то что тебе нужно без особых проблем потомучто насколько я помню ListView позволяет делать итемы разной высоты


2>TVirtualStringTree — правда он для Делфи и Билдера.

2>но думаю если ролазить по инету то можно найти
2>и для вижуала.

Я такой контрол видел для WTL точно — ну в крайнем случае можно и реализовать самому
_BOBAH_, ICQ# 306404574
Muzik:012 ANATOLIY POLO
Re[2]: TreeView Control с многострочными элементами
От: DimaR Ниоткуда  
Дата: 26.09.06 15:57
Оценка:
Здравствуйте, DimaR, Вы писали:

DR>Попробуй DHTML





можно к примеру в програме реализовать web сервер, в форму встроить IE

IE будет делать все красиво
while(work){ money++; time--; if(!time){ die_happy();} }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.