Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.08.2013, 12:27   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию Пишу контрол (ExTreeView)

Дизассемблировал код стандартной библиотеки WinForms и посмотрел, как устроен TreeView - понял, что сделать точно также не получится, ибо нужно переписывать все internal классы, которые он использует в своей сборке, в частности: UnsafeNativeMethods и прочее.
Наследуюсь я от класса Control. То, что я уже сделал работает на "ура", очень быстро и без проблем, но, проблема стоит в том, чтобы создать событие OnMouseClick для узлов дерева. Мои узлы дерева (ExTreeNode class) не наследуются от Control, они вообще, не наследуют ничего. Задача стоит в том, чтобы отловить нажатие клавиши мыши на Glyph узла или на сам узел и уже далее выполнить событие открытия или закрытия.
Может кто-нибудь помочь разобраться?
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 14.08.2013, 17:03   #2
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
По умолчанию

Как насчет VirtualTreeView
Alter вне форума Ответить с цитированием
Старый 14.08.2013, 21:29   #3
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Alter, контрол должен иметь свойство DataSource с возможностью развертки из реляционной таблицы (где строки имеют ссылки на другие строки - родитель -> ребенок и т.д.) базы. Я посмотрю попозже, можно ли наследовать его и прикрутить это свойство. Спасибо за предложение!
___________________________________ ___
В общем, что хочется сказать по этому поводу. Попробовал я сделать через WndProc, но тут же наступил на очередные грабли. С помощью функции SendMessage мне не удалось получить IntPtr на узел дерева. Думать дальше не стал и пошел другим путем. Он чуть медленнее по скорости, но имеет право на жизнь. Я создал объект Hashtable, и добавил туда все узлы в событии добавления узлов к дереву. В итоге получилась таблица типа: ключ:значение. При событии клика мыши по компоненту, перебираются все ключи этой таблицы и точка клика проверяется на вхождение в область узла (Region). Если она входит в эту область, вызывается функция клика мыши по узлу и в функции проверяется вхождение точки клика в область глифа узла, если входит, то выполняем Collapse или Expand, если нет, - меняем состояние узла. Всего-то делов было
Код:
protected override void OnMouseClick(MouseEventArgs e)
        {
            foreach (ExTreeNode node in this.nodeTable.Keys)
            {
                Region nodeRegion = new Region(node.Bounds);
                if (e.Button == MouseButtons.Left || e.Button == MouseButtons.Right && nodeRegion.IsVisible(e.Location))
                {
                    this.OnNodeMouseClick_internal(this, new ExTreeNodeMouseClickEventArgs(node, e.Button, e.Clicks, e.X, e.Y));
                }
            }
            base.OnMouseClick(e);
        }
Код:
        internal void OnNodeMouseClick_internal(object sender, ExTreeNodeMouseClickEventArgs e)
        {
            Region glyphRegion = new Region(e.Node.Cells[0].GlyphBounds);
            if (glyphRegion.IsVisible(e.X, e.Y))
            {
                if (e.Node.HasChildren)
                {
                    if (e.Node.isExpanded)
                    {
                        e.Node.Collapse();
                    }
                    else
                    {
                        e.Node.Expand();
                    }
                }
            }
            else
            {
                
            }
            this.OnNodeMouseClick(e);
            this.Invalidate();
        }
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 15.08.2013 в 11:32.
ImmortalAlexSan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Контрол в контроле odson ASP.NET 1 20.04.2012 09:17
Контрол nats C# (си шарп) 7 14.02.2012 14:49
двигаю контрол мышкой, почему мышка перемещается быстрее чем контрол PaulRom Microsoft Office Access 0 06.12.2011 11:19
контрол Maxxx 83 Помощь студентам 2 01.02.2009 14:08
Делаю сайты, пишу маленькие/большие скрипты. Пишу веб-приложения и приложения под Windows. SkyM@n Фриланс 3 29.12.2007 16:21