|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
принцип реализации векторного редактора
Вопрос 1) принцип реализации того что на скриншоте. 2) что брать за основу для отрисовки различных объектов на рабочем поле.. 3) объекты должны быть перемещаемы и масштабируемы вместе с полем, В общем смысле что-то похожее на Workbench Посоветуйте в какую сторону копать? |
#2
|
|||
|
|||
Я бы начал с того, что создал класс для всех объектов
- список точек и линий между ними - особо выделены точки возможного присоединения - координаты положения на схеме и - можно еще предусмотреть привязанную к элементу надпись От этого класса наследуются классы реальных эл-тов, в которых собственно описывается только внешний вид. Вся работа схемы производится с абстрактным классом элементов. Соответственно он должен уметь рисовать себя с учетом масштаба. |
#3
|
|||
|
|||
Отличненько, спасибо.
1) элементы будут браться из библиотеки (соответственно буду еще и редактор библиотеки делать) 2) Я почти не работал с графикой, так что спрошу: рабочее поле реализовывать через Canvas или OpenGL? 3) Класс этот новый создавать от какого класса? |
#4
|
|||
|
|||
Цитата:
Я бы использовал Canvas. Все-таки это не 3D. Цитата:
Без предка: Код:
type TElement = class end; А для его метода отображения проще передать Canvas как параметр. |
#5
|
|||
|
|||
Последний вопросик: может есть пример, где при отрисовке через Canvas, при перемещении элемента не стиралось то место, где он был ранее и чтобы небыло мерцания?
|
#6
|
|||
|
|||
Есть два варианта.
1-й. При перемещении элемента рисуется его контур с использованием xor. Такой метод позволяет удалить нарисованный контур сделав вывод два раза подряд. Окончательная отрисовка производится после отпускания мыши. 2-й. Можно реализовать буферизированный вывод. Схема рисуется в отдельном буфере (напр. Canvas отдельного BitMap) и сам процесс отрисовки не виден. Когда буфер нарисован, он быстренько выводится на экран. В этом случае мерцания видно не будет. В любом варианте нужно не забыть отключить отрисовку фона окна обработав событие procedure WMEraseBkGnd(var Message:TWMEraseBkGnd); message WM_ERASEBKGND; Если этого не сделать, при вызове метода PAint будет сначала рисоваться фон, потом схема. Это и дает мерцание. |
#7
|
||||
|
||||
Цитата:
|