0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
|
|
1 | |
Мерцание при собственной отрисовке TreeView26.07.2012, 12:57. Показов 5023. Ответов 16
Метки нет (Все метки)
Привет всем.
На форме есть элемент класса, наследника элемента treeview. В классе переопределен метод OnDrawNode(DrawTreeNodeEventArgs e). В методе отрисовываются все видимые узлы, и стиль отрисовки зависит от того, развернут/свернут или выбран узел. Во время работы приложения при разворачивании и сворачивании узла есть видимое мерцание, как будто элементы стираются и отрисовываются несколько раз. Прописывала и BeginUpdate(), и EndUpdate(). Потом пробовала использовать Refresh() и Invalidate(). Дерево все равно моргает((( На худой конец, может ли это быть связанно с низкой производительностью машины?
0
|
26.07.2012, 12:57 | |
Ответы с готовыми решениями:
16
Мерцание при отрисовке фигуры. Как избавиться? Мерцание в TreeView при горизонтальном скролле Убрать мерцание TreeView при Resize формы Как ускорить работу TreeView (мерцание при скроллинге) |
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
26.07.2012, 13:08 | 2 |
Может быть DoubleBuffered не включено?
0
|
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
|
|
26.07.2012, 14:34 [ТС] | 3 |
DoubleBuffered не влияет на работу Treeview, на msdn это везде написано большими буквами.
0
|
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
26.07.2012, 15:00 | 4 |
Ну тогда прикрепите свой проект целиком пожалуйста
0
|
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
|
|
27.07.2012, 07:57 [ТС] | 5 |
Так, проект длинной 5 метров, Информация получатся через апи-функцию(Post- и get-запросы), доступ к апишке с паролем. Прикреплять? Могу скинуть только сам класс-наследник и описание его работы, но боюсь, это мало что прояснит((
0
|
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
27.07.2012, 09:13 | 6 |
А, да, можно конечно только сам класс.
0
|
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
|
|
27.07.2012, 10:18 [ТС] | 7 |
Вот класс-наследник. В принципе, все комментарии есть))
Ну и еще, есть такая штука, что узлы, которые не подвижны, не перерисовываются. Т.е. если перед выбранным узлом есть еще несколько, то они не перерисовываются, а заново отрисовываются только разворачиваемый узел и все узлы, которые меняют свое местоположение. Как это сделать?
0
|
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
27.07.2012, 10:31 | 8 |
Еще не хватает Tree1Node
Добавлено через 7 минут Ну и желательно Properties.Resources.Op и Properties.Resources.Cl
0
|
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
|
|
27.07.2012, 11:05 [ТС] | 9 |
класс Tree1Node и картинки для иконок. В принципе, строки, где используются иконки можно закомментировать, от этого ничего не изменится)
0
|
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
27.07.2012, 11:35 | 10 |
Мда. Что-то совсем у меня странно все работает. А вообще какая цель создания своего TreeView была? Сделать два типа узлов с разными картинками и шрифтами? Зачем тогда все эти дополнительные свойства в Tree1Node? Хватило бы и одного isTemplate.
Добавлено через 3 минуты Да и вообще разные картинки и разные шрифты вроде и в стандартном TreeView можно задавать?
0
|
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
|
|
27.07.2012, 11:42 [ТС] | 11 |
Эхх, ну да)) просто проект уже кучу раз переделывался, а свойства остались от старых версий. Некоторые еще нужны при постороении этого чудо-дерева)))
Ну, не только дерево с двумя типами узлов. Дело в том, что секции могут содержать внутри еще секции, и еще, и только потом набор шаблонов. Все картинки получаются одним большим скопом, поэтому важно знать индекс и узла, и картинки, чтобы потом задать свое соответствие между ними. Да, согласна, что все очень запутанно, но так оно обычно и бывает(( А в чем заключается странность работы?
0
|
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
27.07.2012, 12:16 | 12 |
Ну например я кликаю по одним узлам, а раскрываются другие. Наверное там еще какие-то свойства надо задавать у MyOwnTree кроме DrawMode? Задавали бы уж их все в самом MyOwnTree, в конструкторе скажем.
Добавлено через 8 минут Я бы на вашем месте все-таки стандартным TreeView воспользовался. Так и не увидел что может ваш класс такого, что не может TreeView.
0
|
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
|
|
27.07.2012, 12:28 [ТС] | 13 |
Ну да, конечно, у меня еще куча методов переопределенно: выбор, сворачивание, разворачивание. Только в классе формы. Да и проблема-то не этом, что не те узлы, а в том, что они мерцают слишком часто, пока щелкаешь по дереву
Добавлено через 4 минуты нет, они там масштабируются на определенный размер imagelist-a. Т.е. если imagelist имеет размеры изображений 30х40, то даже если в исходном картинка была 20х50, то после попадания в imagelist она растянется или сожмется до 30х40. А к дереву можно подключать только imagelist, и только один. Если бы у меня картинки шаблонов и секций были одного размера, то конечно я бы стандартным элементом обошлась. Да дело в том, что у заказчиков свой взгляд на мою работу. Специально для меня эти картинки никто не будет подгонять под единый размер и вид.
0
|
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
|
|
27.07.2012, 12:34 [ТС] | 14 |
Вот два скрина моего проекта. Тут видно, что секции имеют вложенные секции. изображение при раскрытии узла меняется, а у шаблонов изображения разных размеров.
0
|
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
|
27.07.2012, 12:40 | 15 |
Единственное что могу посоветовать - завести счетчик перерисовок и выводить его в консоль например в самом начале OnDrawNode. Хотя бы посмотрите нет ли у вас лишних перерисовок.
У меня кстати в вашем MyOwnTree ничего не мерцает даже если по тысяче элементов в узел добавлять. Так что тут точно не в производительности дело. Может вы еще подписаны на какое-нибудь DrawNode?
0
|
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
|
|
27.07.2012, 13:15 [ТС] | 16 |
А вот тогда можете объяснить хитрость если переопределять метод OnDrawNode,
и если обрабатывать событие DrawNode?
0
|
431 / 432 / 93
Регистрация: 16.07.2012
Сообщений: 886
|
||||||
27.07.2012, 14:55 | 17 | |||||
Ну видимо событие DrawNode придумано для того случая, если вам надо всего лишь отрисовку узлов по-своему сделать, а не всю логику TreeView менять и поэтому вы не хотите заморачиваться с наследованием от него - просто взяли стандартный TreeView, подписались на событие - и вперед. А уж если наследуетесь и переопределяете OnDrawNode, то событие просто не используется. То есть или то, или то.
Добавлено через 1 час 35 минут Вот собственно. Если у нас изображения в List<Image> Images и TreeView.ItemHeight установлен скажем в 50, то отключаем стандартную прорисовку, подключаем обработчик и все дела:
1
|
27.07.2012, 14:55 | |
27.07.2012, 14:55 | |
Помогаю со студенческими работами здесь
17
Пробелы при отрисовке текста Потеря качества при отрисовке в Bitmap Чрезмерное потребление ОЗУ при отрисовке Пресловутое моргание картинок при отрисовке Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |