Естьу меня дерево, элементами которого являются строки. Дерево имеет несколько уровней вложенности. Всего порядка 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>>
Скриншоты в смысле.
А то так одной фантазией сложно вообразить, что именно там коряво
(в конце концов Word в режиме структуры документа ничего, не страшный)
вот приблизительный скрин, того что получилось.
в конечном приложении текста будет больше, и уровней тоже...
рамку в принципе можно убрать
N>Скриншоты в смысле.
N>А то так одной фантазией сложно вообразить, что именно там коряво
N>(в конце концов Word в режиме структуры документа ничего, не страшный)... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Здравствуйте, 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
Здравствуйте, 2bas, Вы писали:
2>Здравствуйте, _BOBAH_, Вы писали:
_BO>>Я думаю тебе нужен "деревянный" контрол на основе ListView и такой я точно где то видел, где вот только не припомню, а вот на его основе уже можно сделать то что тебе нужно без особых проблем потомучто насколько я помню ListView позволяет делать итемы разной высоты
2>TVirtualStringTree — правда он для Делфи и Билдера.
2>но думаю если ролазить по инету то можно найти
2>и для вижуала.
Я такой контрол видел для WTL точно — ну в крайнем случае можно и реализовать самому
_BOBAH_, ICQ# 306404574 
Muzik:012 ANATOLIY POLO