C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Рисуем граф, Нужно уметь кидать и перемещать
Schumi
Отправлено: 18.10.2004, 20:33


Машинист паровоза

Группа: Участник
Сообщений: 206



Представьте,есть форма,на которую можно кидать однотипные элементы.Нужно их уметь перемещать,удалять.Также элементы могут быть соединены между собой.
Если кто-либо уже сталкивался с такой проблемой,подскажите с чего начинать.В смысле чем пользоваться,чтобы не потратить время зря.
Как я представляю,можно делать всё на PaintBox,но не будет ли много гемору:так как,если начнём двигать элемент(вершину),то соответственно нужно перерисовывать и линии соединения,возникают мерцания.Но это ладно,но если захотим удалить соединения,то нужно перебирать координаты всех соединённых пар вершин,а если вершин много.
А когда перемещаю объект,надо затирать старое изображение.
Valdemar
Отправлено: 19.10.2004, 09:15


Мастер участка

Группа: Участник
Сообщений: 433



Я когда-то делал подобное примерно так, точно уже не помню:
1. Били созданы классы для описания разных типов фигур, которое содержало информацию о количестве точек соединения, указатели на подключенные соединительные линии, графическом представлении фигуры, поведении объекта в зависимости от значений на входах, т.к. точки соединения делились на входы и выходы и др.
2. Был класс для описания соединительной линии, в котором имелись указатели на соединяемые элементы, а также метод рисования линии.
3. Конкретный экземпляр класса фигур описывал конкретный элемент схемы, т.е. его положение, цвет, с какими линиями он соединен. Аналогично для соединительных линий.
4. При удалении или перемещении элемента схемы удалялись или перерисовываль только те линии, которые соединены с нужным элементом схемы без лишнего перебора.
Еще можете посмотреть на сайте www.tmssoftware.com компонеты Diagram Studio, может они вам помогут.
Schumi
Отправлено: 20.10.2004, 18:59


Машинист паровоза

Группа: Участник
Сообщений: 206



Да,но представь,что ты ведёшь свою вершину,и на пути попадается "чужая" линия или другая вершина.Ты при движении перерисовываешь вершину и связанные с ним соединения,так получается другие объекты должны затираться?
И ещё,как ты перерисовываешь объекты? По хорошему,надо как-то задать стиль линии в стиле XOR,но у меня что-то не получается.И сейчас я просто дважды рисую изображение: сперва цветом фона рисую, (получается стираю),а затем уже цветом линии снова рисую на новом сдвинутом месте.
Valdemar
Отправлено: 21.10.2004, 09:50


Мастер участка

Группа: Участник
Сообщений: 433



Я уже не помню, но кажется при перемещении элементов схемы перемещался только контур элемента, а сам элемент перерисовывался уже на новом месте. А отрисовка схемы производилась в обработчике события WM_PAINT.
Установить режим, при котором повтороное рисование на том же месте будет стирать изображение можно так:
CODE
Form1->Canvas->Pen->Mode=pmNotXor;

Вернуться в Вопросы программирования в C++Builder