Форум программистов, компьютерный форум, киберфорум
ООП и паттерны
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 10

Управление объектами графической сцены

10.08.2016, 15:20. Показов 1247. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Столкнулся с проблемой, к которой не знаю с какой стороны подойти.
Разрабатываю редактор диаграмм или схем (кому как удобнее). Диаграмма представляет собой контейнер, в котором содержатся графические компоненты. Уже реализована функциональность отрисовки диаграммы на графическом контексте, масштабирование и позиционирование вида, поиск на диаграмме компонентов, пересекающихся или содержащихся в заданной геометрической области.
Теперь нужно сделать графические компоненты интерактивными, чтобы они реагировали на пользовательский ввод и могли взаимодействовать между собой.

Я могу найти на диаграмме компонент, находящийся в зоне действия курсора мыши. Что дальше?
С одной стороны, все компоненты индивидуальны, они по разному должны реагировать на события мыши, у некоторых могут быть активные области и реакция должна меняться в зависимости от того в какую область указывает курсор. Логично было бы передать событие мыши компоненту и позволить ему самому решить что делать. Но для некоторых действий компонентам нужно обращаться к диаграмме, в которой они содержатся, к панели, на которой отрисовывается диаграмма, к документу в целом и т. д. То есть компонент должен содержать прямые ссылки на эти объекты, что приводит к сильной связности.

С другой стороны, можно сделать управляющий объект, который будет принимать события пользовательского ввода и выполнять действия с графическими компонентами. Но тогда компоненты должны иметь развитый интерфейс, позволяющий управляющему объекту получить всю нужную информацию, и при добавлении нового вида компонентов может потребоваться вносить изменения в этот интерфейс. То есть система получится негибкая.

Подскажите пожалуйста как решаются такие задачи
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2016, 15:20
Ответы с готовыми решениями:

Снимок графической сцены
Доброго времени суток. Реализую графический интерфейс для классической шахматной задачки "о восьми ферзях". Задачка решается...

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

Буфер трафарета для сцены с несколькими объектами
Сделать вырез в фигуре с использованием буфера трафарета несложно, в сети примеров хватает. Но что-то у меня некорректно работает для...

6
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.08.2016, 02:16
Цитата Сообщение от AlikAlik Посмотреть сообщение
То есть компонент должен содержать прямые ссылки на эти объекты, что приводит к сильной связности.
компонент посылает событие-запрос на получение нужной ему информации.
он не знает кому, и не знает, кто ему ответит.
1
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 10
21.09.2016, 12:19  [ТС]
Спасибо, вроде бы что то получилось..
0
 Аватар для snake32
3510 / 1693 / 236
Регистрация: 26.02.2009
Сообщений: 8,451
Записей в блоге: 6
21.09.2016, 13:38
AlikAlik, можете описать что получилось?
Вот у меня есть например глобальное события от мыши: mousedown, mouseup,mousemove с параметрами. При добавлении нового компонента что происходит дальше?
0
1968 / 824 / 115
Регистрация: 01.10.2012
Сообщений: 4,868
Записей в блоге: 2
22.09.2016, 10:29
Конечно зависит от конкретной системы, но по моим наблюдениям "управляющий объект" (т,е. второй вариант) заметно лучше. Хотя объекты разные - их движения достаточно общие. Движение может быть блокировано и/или ограничено по всем осям или некоторым, эти данные объект выдает "двигающему" через какой-то интерфейс, не проблема. Трудно придумать еще какое-то "уникальное" движение объекта. А в варианте "двигать так чтобы не пересекать др объекты" становится очевидным что сам объект это сделать не может, т.е. "двигающий" все равно нужен. Для самого объекта достаточно события "moved", т.е. на движение он реагировать может, но не "сам себя двигать"
0
1 / 1 / 1
Регистрация: 10.08.2016
Сообщений: 10
23.09.2016, 07:57  [ТС]
Я распределил обязанности между управляющим объектом и компонентами так:
Управляющий объект определяет компонент, которому следует передавать событие. Обычно это первый ближайший к курсору компонент, но выбранные имеют приоритет.
Также он управляет выбором (мышью или с помощью лассо). От компонента только запрашивает информацию выбираемый он или нет.
Компоненты делают всё остальное. Например перемещение работает так: компонент получает событие mousePessed, определяет что мышь нажата над областью, за которую можно перетаскивать и подготавливается к перетаскиванию (запоминает исходное положение, меняет своё внутреннее состояние, посылает событие-запрос на "захват мыши" (поясню дальше) ), если после этого приходит событие mouseDrag, происходит само перетаскивание, после прихода события mouseRelease перетаскивание завершается (состояние меняется на обычное, посылается запрос на "возврат мыши").
Что такое "захват мыши"? Управляющий объект передаёт событие мыши ближайшему компоненту, но некоторые операции (перетаскивание, рисование) требуют чтобы событие мыши всё время передавалось только перемещаемому или рисуемому компоненту. Я нашёл такой выход, что компонент с помощью события запрашивает у управляющего объекта "захват мыши" управляющий объект при этом устанавливает специальный флаг, запоминает компонент и в дальнейшем передаёт события мыши ему, до тех пор, пока тот не вернёт управление.

Добавлено через 10 минут
Смена курсора мыши по инициативе компонента происходит тоже с помощью события. У меня компонент "не знает" панель, на которой всё рисуется, а управляющий объект "знает".
При перемещениях, рисованиях нужно взаимодействовать с окружающими компонентами. Для взаимодействия у каждого вида компонентов есть свой объект Interactor (использует паттерн Visitor). Механизм такой: компонент делает событие-запрос на получение списка окружающих компонентов. Управляющий объект получает этот запрос, находит ближайшие компоненты и передаёт список вопрошающему. Тот, получив список, поочередно передаёт компоненты из него Interactor и таким образом получает нужные сведения (можно/нельзя здесь разместиться и т.д.)

Добавлено через 33 минуты
Вкратце так. Я делаю подобный редактор впервые, поэтому нет уверенности что "всё правильно сделал" и в дальнейшем не будет проблем с расширением, но сейчас по крайней мере сие работает.
Остались открытыми некоторые вопросы, например, внешний Drag & Drop.
Ещё интересный момент - это динамическая подсветка точек соединения, к примеру, приблизился коннектор на нужное расстояние и у компонента подсвечивается крестиком место куда можно приконнектиться. Сейчас я это сделал путём засовывания внутрь компонента объектов, которые должны быть отрисованы вместе с ним. Интересно бы узнать как это делается в каких нибудь Visio, Autocad, КОМПАС и т. д.
1
1968 / 824 / 115
Регистрация: 01.10.2012
Сообщений: 4,868
Записей в блоге: 2
23.09.2016, 09:53
Цитата Сообщение от AlikAlik Посмотреть сообщение
Что такое "захват мыши"? Управляющий объект передаёт событие мыши ближайшему компоненту, но некоторые операции (перетаскивание, рисование) требуют чтобы событие мыши всё время передавалось только перемещаемому или рисуемому компоненту. Я нашёл такой выход, что компонент с помощью события запрашивает у управляющего объекта "захват мыши" управляющий объект при этом устанавливает специальный флаг, запоминает компонент и в дальнейшем передаёт события мыши ему, до тех пор, пока тот не вернёт управление.
Обычно это поддерживается ядром (глобальным обработчиком событий)

Цитата Сообщение от AlikAlik Посмотреть сообщение
Вкратце так. Я делаю подобный редактор впервые, поэтому нет уверенности что "всё правильно сделал"
Больше раскованности и/или непринужденности. Мне неизвестен какой-то общий "единственно правильный" способ написания графических редакторов, их можно делать очень всяко-разно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.09.2016, 09:53
Помогаю со студенческими работами здесь

Управление объектами
Дороу)) В общем не могу нигде найти: Как мне поменять свойства другого объекта не зная его конкретный класс? Будь то TButton или TLabel...

Управление объектами сенсором
Всем привет, столкнулся с проблемой. Нужно сделать так, чтобы при нажатии на спрайт его можно было переместить с помощью сенсора. Но на...

Скриптовое управление объектами UI
на сцену добавил Canvas, в него Button, на Canvas повесил скрипт, вывел в Button на клик метод, всё хорошо. НО! Как управлять самим...

Управление динамическими объектами
Помогите решить проблему: 1 таймер (интервал 3000) создает динамические объекты: TImage *i1=new TImage(Form1); i1->Parent=Form1; ...

Децентрализованное управление несколькими объектами
Имеется туннель в котором появляются различного рода препятствия(буквы Г или просто перегородки и тому прочее). Так же имеются несколько...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru