Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/26: Рейтинг темы: голосов - 26, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 11.07.2012
Сообщений: 16
1

Мерцание при собственной отрисовке TreeView

26.07.2012, 12:57. Показов 5023. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем.
На форме есть элемент класса, наследника элемента treeview.
В классе переопределен метод OnDrawNode(DrawTreeNodeEventArgs e). В методе отрисовываются все видимые узлы, и стиль отрисовки зависит от того, развернут/свернут или выбран узел.
Во время работы приложения при разворачивании и сворачивании узла есть видимое мерцание, как будто элементы стираются и отрисовываются несколько раз.
Прописывала и BeginUpdate(), и EndUpdate(). Потом пробовала использовать Refresh() и Invalidate(). Дерево все равно моргает(((

На худой конец, может ли это быть связанно с низкой производительностью машины?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2012, 12:57
Ответы с готовыми решениями:

Мерцание при отрисовке фигуры. Как избавиться?
Когда рисую какую-то фигуру она мерцает( как избавиться от мерцания? подскажите как можно...

Мерцание в TreeView при горизонтальном скролле
Добрый день,Форумчане. Такая проблема: у меня на форме есть элемент treeview, там список...

Убрать мерцание TreeView при Resize формы
Добрый день,форумчане. Такая проблема: на форме есть элемент TreeView. Отрисовываю я его сама,...

Как ускорить работу TreeView (мерцание при скроллинге)
При пролистывании TreeView (а там очень много элементов), возникают мерцания, как будто дерево...

16
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
Цитата Сообщение от canopen Посмотреть сообщение
Может быть DoubleBuffered не включено?
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
Вот класс-наследник. В принципе, все комментарии есть))

Ну и еще, есть такая штука, что узлы, которые не подвижны, не перерисовываются. Т.е. если перед выбранным узлом есть еще несколько, то они не перерисовываются, а заново отрисовываются только разворачиваемый узел и все узлы, которые меняют свое местоположение. Как это сделать?
Вложения
Тип файла: txt MyOwnTree.txt (9.5 Кб, 40 просмотров)
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 и картинки для иконок. В принципе, строки, где используются иконки можно закомментировать, от этого ничего не изменится)
Вложения
Тип файла: rar Архив.rar (1.4 Кб, 18 просмотров)
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
Вот два скрина моего проекта. Тут видно, что секции имеют вложенные секции. изображение при раскрытии узла меняется, а у шаблонов изображения разных размеров.
Вложения
Тип файла: rar Desktop.rar (205.6 Кб, 19 просмотров)
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, то отключаем стандартную прорисовку, подключаем обработчик и все дела:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void TreeViewDrawNode(object sender, DrawTreeNodeEventArgs e)
{
    if (e.Node.Nodes.Count > 0)
    {
        var icon = e.Node.IsExpanded ? Res.Expanded : Res.Collapsed;
        var iconRect = new Rectangle(e.Bounds.X + e.Node.Level * 50, e.Bounds.Y + 5, icon.Width, icon.Height);
        e.Graphics.DrawIcon(icon, iconRect);
        var image = Images[e.Node.ImageIndex];
        var rect = new Rectangle(iconRect.Right, e.Bounds.Y, image.Width, image.Height);
        e.Graphics.DrawImage(image, rect);
        var point = new PointF(rect.Right + 5, rect.Top + 10);
        e.Graphics.DrawString(e.Node.Text, new Font("Georgia", 15), Brushes.DarkBlue, point);
    }
    else
    {
        var image = Images[e.Node.ImageIndex];
        var rect = new Rectangle(e.Bounds.X + e.Node.Level * 50 + 30, e.Bounds.Y, image.Width, image.Height);
        e.Graphics.DrawImage(image, rect);
        var point = new PointF(rect.Right + 5, rect.Top + 10);
        e.Graphics.DrawString(e.Node.Text, new Font("Georgia", 15), Brushes.Black, point);
    }
}
1
27.07.2012, 14:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2012, 14:55
Помогаю со студенческими работами здесь

Пробелы при отрисовке текста
Текст рисуется с пробелами - рис. слева (исп. System.Drawing.Graphics: DrawText и MeasureString)....

Потеря качества при отрисовке в Bitmap
Доброго дня! Собственно проблема такая - если отрисовывать в PictureBox непосредственно и рисовать...

Чрезмерное потребление ОЗУ при отрисовке
Требуется написать программу для захвата видео с экрана и вывода в pictureBox. Видео(вернее поток...

Пресловутое моргание картинок при отрисовке
Имеется форма с фоновым изображением. По таймеру я запускаю картинку, которая должна переместиться...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru