Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
-17 / 10 / 5
Регистрация: 24.12.2014
Сообщений: 88

Treeview Drag'n'Drop прорисовка ветви с её дочерними элиментами

19.02.2015, 20:30. Показов 3107. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер господа!,
Ищу ответ на мой вопрос, не получается прорисовать всю ветку и её дочерние элементы при перетаскивании верхнего элемента.
Вот что получается во вложении... А хотелось бы что бы рисовался 3 и 4 элемент!!!
Помогите плиз!
Изображения
 
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2015, 20:30
Ответы с готовыми решениями:

Drag and Drop узла из TreeView в StringGrid
Привет. Есть вопрос (по применению drag and drop) при перетаскивании узла из treeView в StringGrid; На событии dragdrop stringgrid пишу: ...

Как проскролить Treeview во время Drag&Drop?
B VB6 это легко делается использованием Win32 API функции SendMessage(...), в . NET это почему-то неработает. Фрагмент кода: Private...

Treeview Drag'n'Drop как рисовать линии и кнопки в дереве?
Собственно сабж, есть Treeview хочу получить нарисованную ветку... Image + Text ... Можно получить, а вот как нарисовать...

9
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
19.02.2015, 22:41
Лучший ответ Сообщение было отмечено BRcr как решение

Решение

Придется использовать наследника от TDragDockObjectEx, в его конструкторе копировать изображение TreeView на Bitmap (TreeView1->PaintTo + Bitmap->Lock()/Unlock()), вырезать из его нужную часть (ту, которая перетягивается в данный момент), и заталкивать получившуюся картинку в TDragImageList. Тогда при Drag-е будет показываться не стандартная картинка, а та, которую ты создал таким образом... Примеры, как должно происходить взаимодействие с этим классом, есть на форуме. Например, тут: Drag'n'Dock Мерцание и тормоза при перерисовки рамки окна
2
-17 / 10 / 5
Регистрация: 24.12.2014
Сообщений: 88
20.02.2015, 09:29  [ТС]
volvo
Если по аналогии то что сюда передавать?
DragObject = new TMyDragDock(???);
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
20.02.2015, 12:01
Лучший ответ Сообщение было отмечено Implosion_IT как решение

Решение

Вот как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class TMyDragDock : public TDragDockObjectEx
{
protected:
    virtual TDragImageList* __fastcall GetDragImages(void)
    {
        // зачем Control->Tag - поймешь, когда тебе понадобится
        // в процедуре EraseDragDockImage того контрола, который перетаскивается,
        // имея только указатель на TDragDockObject, вытащить этот самый DragImageList
        return (TDragImageList*)(Control->Tag);
    }
 
public:
    __fastcall virtual TMyDragDock(TControl* AControl);
 
    inline __fastcall virtual ~TMyDragDock(void)
    {
        delete((TDragImageList*)(Control->Tag));
    }
};
 
__fastcall TMyDragDock::TMyDragDock(TControl* AControl)
    : TDragDockObjectEx(AControl)
{
    std::auto_ptr<Graphics::TBitmap>Bmp(new Graphics::TBitmap());
    TTreeView *tv = static_cast<TTreeView*>(AControl);
    TRect RCurr = tv->Selected->DisplayRect(false);
    TRect RNext;
 
    TTreeNode *sibling, *last;
    int h, w;
    if ((sibling = tv->Selected->getNextSibling()) != 0) // есть следующий элемент того же уровня?
    {
        RNext = sibling->DisplayRect(false);
        w = Max(RCurr.Width(), RNext.Width());
        h = Min(RNext.Top - RCurr.Top, tv->Height);
    }
    else if ((last = tv->Selected->GetLastChild())
        != 0 && tv->Selected->Expanded) // Есть дочерние элементы + перетягиваемый айтем раскрыт?
    {
        RNext = last->DisplayRect(false);
        w = Max(RCurr.Width(), RNext.Width());
        h = Min(RNext.Top + RNext.Height() - RCurr.Top, tv->Height);
    }
    else // нет, просто айтем - одиночка
    {
        w = RCurr.Width();
        h = RCurr.Height();
    }
 
    Bmp->SetSize(w, h);
 
    Bmp->Canvas->Lock();
    tv->PaintTo(Bmp->Canvas->Handle, 0, -RCurr.Top);
    Bmp->Canvas->Unlock();
 
    TDragImageList* FDragImageList = new TDragImageList(Bmp->Width, Bmp->Height);
    FDragImageList->Masked = true;
 
    FDragImageList->Clear();
 
    FDragImageList->Add(Bmp.get(), 0);
    Control->Tag = (int)FDragImageList;
}
 
void __fastcall TForm1::TreeView1DragOver(TObject *Sender, TObject *Source,
    int X, int Y, TDragState State, bool &Accept)
{
    Accept = (Sender == TreeView1);
}
 
void __fastcall TForm1::TreeView1StartDrag(TObject *Sender,
    TDragObject *&DragObject)
{
    DragObject = new TMyDragDock(TreeView1); // <---
}
, при использовании свойств Images/StateImages возможны проблемы: изображение может не показываться полностью, пока курсор мыши (при нажатой левой кнопке) не выйдет за пределы TreeView, когда он вернется - изображение будет полным. Причина пока непонятна, попробую разобраться. Без TreeView.Images все работает как часы...
1
-17 / 10 / 5
Регистрация: 24.12.2014
Сообщений: 88
20.02.2015, 12:37  [ТС]
volvo,
Min, Max самописные или есть в какой-то, то библиотеке?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
20.02.2015, 12:47
C++
1
#include <Math.hpp>
1
-17 / 10 / 5
Регистрация: 24.12.2014
Сообщений: 88
20.02.2015, 12:50  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
DragObject = new TMyDragDock(TreeView1); // <---
тут ошибка, по которой я и задавал вопрос...
компилятор ругается
A Control cannot have itself as its parent.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
20.02.2015, 12:53
Это не тут ошибка, а в твоей TreeView1DragDrop, которую ты не показал, ошибка. Что-то не так делаешь именно при перемещении узлов, физически... У меня ошибки нет например, что дальше? Я опять что-то неправильно делаю?
1
-17 / 10 / 5
Регистрация: 24.12.2014
Сообщений: 88
21.02.2015, 11:22  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    
void __fastcall TfCategories::TreeView1DragDrop(TObject *Sender, TObject *Source,
                    int X, int Y)
{
TTreeView *TV = dynamic_cast<TTreeView*>(Sender);
    TTreeNode *Src,*Dst = TV->GetNodeAt(X, Y);
    if (Dst!=NULL) {
        Src = TV->Selected;
        Src->MoveTo(Dst, naAddChildFirst);
        Dst->Expand(true);
        TV->Selected=Dst;
    }
}
Добавлено через 5 минут
volvo
Спасибо, огромное за потраченное время, дальше уж разберусь)))

Добавлено через 59 секунд
Ошибка вылетает если дроп не верный)

Добавлено через 22 часа 12 минут
volvo С данным вопросом не разобрался?... у меня нет идей(
Цитата Сообщение от volvo Посмотреть сообщение
, при использовании свойств Images/StateImages возможны проблемы: изображение может не показываться полностью, пока курсор мыши (при нажатой левой кнопке) не выйдет за пределы TreeView, когда он вернется - изображение будет полным. Причина пока непонятна, попробую разобраться. Без TreeView.Images все работает как часы...
Добавлено через 39 секунд
у меня как раз используется
Цитата Сообщение от Implosion_IT Посмотреть сообщение
TreeView.Images
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33405 / 21515 / 8236
Регистрация: 22.10.2011
Сообщений: 36,916
Записей в блоге: 12
21.02.2015, 12:31
Нет. Непонятно совершенно. Абсолютно идентичный код на Дельфи показывает как положено, любой TreeView, хоть с Image-ми, хоть без, сразу показывается полная картинка. Билдер опять в своем репертуаре - не хочет делать того, что положено.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2015, 12:31
Помогаю со студенческими работами здесь

Drag and Drop: Перетащить какой - либо пункт меню из TreeView в TextBox
Всем привет. Есть компонент на странице TreeView, заполняется из БД. Есть ли возможность перетащить какой-либо пункт меню в TextBox и...

Drag&Drop: как определить, что некий итем TreeView был перетянут в строку ListView?
Доброго времени суток! Подскажите как используя с++ и WINAPI определить, что некий итем treeview был притащен в строку listview?

Прорисовка treeView из БД
Добрый день. У меня задание с иерархиями. Создаю таблицу с такими полями: где, ID - уникальный номер, CODE - код...

Хранение переменных в ветви treeview
В treeview с помощью кнопки создаю item.add. дерево создается таким путём: procedure TForm1.Button2Click(Sender: TObject); var ...

Drag And Drop
Подскажите пожалуйста где здесь изменить текст чтобы было четкое распределение источник1 только в приемник1, источник2 только в приемник2...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru