Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Вывод текста |
Автор: CrazyPerson 20.12.2008, 14:06 |
В процессе написания программы понадобилось выводить текст на экран в определенном формате: name1 description11 example11 example12 description2 example21 example22 name2 ... Сначала пытался использовать для этой цели RichEdit, но не понял как сделать отступы только для части текста. TreeView тоже не помог, так как описания и примеры могут быть большой длинны, и содержать несколько строчек. А в TreeView, как я понял, один элемент занимает ровно одну строчку. Никто не знает что было бы удобно использовать для такого форматирования текста? |
Автор: GremlinProg 20.12.2008, 16:58 | ||||
вот общий, нерекурсивный псевдо-код для вывода динамического дерева
вместо табуляторов можно использовать любое обозначение отступа: хоть пробелы, хоть отступ на n пикселей при выводе содержимого узла в окно если содержимое каждого узла многострочное, значит этот отступ нужно делать перед каждой строкой текущего узла для реализации алгоритма требуется ввести все задействованные методы: get_parent - возвращает родительский узел, или 0, если такового не существует get_first_child - возвращает первый дочерний подузел для заданного родительского узла, или 0, если такового не существует get_last - возвращает самый последний братский подузел, который находится на том же уровне иерархии дерева, у одного родителя, или 0, если такового не существует get_prev - возвращает предыдущий братский подузел, или 0, если такового не существует print_tabs - печатает заданное число табуляторов с текущей позиции print_content - печатает содержимое узла с текущей позиции последние 2 метода - на выбор, если многострочный вывод, значит их нужно объединить в один, которому в параметрах, помимо самого узла, передается tabs_count если все дочерние узлы находятся в массиве, то можно еще проще сделать продолжение итераций, т.е. без get_first_child, get_last, get_prev:
, где node.children - обращение к массиву дочерних узлов, родителя node Node - псевдо-обозначение идентификатора узла если все элементы дерева расположены в массиве, значит в качестве Node можно использовать индекс узла в этом массиве если под каждый элемент дерева распределяется отдельный блок памяти, значит Node - указатель на узел CrazyPerson, если не понял как приспособить этот алгоритм, тогда выкладывай структуру своей иерархии, подскажем. |
Автор: CrazyPerson 20.12.2008, 17:44 | ||
Ого, спасибо за столь развернутый ответ! Но к сожалению это несколько не то. Обход самого дерева я то быстро написал. А проблема у меня возникла со следующей частью кода:
Ну вот в treeView все выводить в одну строку, и соответственно это никак не подходит для многострочного вывода. А в RichEdit я не понял как выводить "параграф текста" с заданным отступом. Ну как я понял там можно разбивать текст на параграфы и выводить их с различным форматированием. Но вот сделать этого у меня не получилось... |
Автор: GremlinProg 20.12.2008, 19:13 | ||||||
treeView тоже может выводить многострочные узлы:
а если использовать RichEdit, то параграф в принципе избыточен, есть более простой способ: писать перед каждой строкой табуляторы в числе tabs_count, размер которых впоследствии можно настроить через EM_SETTABSTOPS
|
Автор: CrazyPerson 20.12.2008, 23:27 |
Ага, спасибо. msdn'ом я еще не научился нормально пользоваться, но я стараюсь. Но и тот и тот способ подразумевает что мне придется вручную разбивать текст на строки, и никакого готового word wrap'a не будет. Или я не правильно понял что в richedit придется добавлять ручками табы перед каждой строчкой? |
Автор: CrazyPerson 21.12.2008, 22:21 |
О! То что нужно! Еще раз спасибо. Вот про EM_SETPARAFORMAT я нашел, а про то, что еще выделять текст надо - не нашел.. |