Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Управление слоем графических объектов  (Прочитано 8004 раз)
0 Пользователей и 1 Гость смотрят эту тему.
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« : 13-08-2010 06:51 » 

Много написано в этой теме про состояния - не хочется создавать новую. Димка, подскажи, какой подход к след. проблеме:
Есть класс Layout, на который можно добавлять различные визуальные Object'ы (пока это растровые изображения). Эти Object'ы интерактивны. Ну, в начале было просто - на MouseEnter обводил их рамочкой, на MouseLeave убирал рамочку. Обрабатывал события в самом экземпляре Object. Дальше - хуже.
Когда перетаскиваешь объект - его можно "протащить" под другим, у которого Z-индекс выше, таким образом, срабатывает MouseLeave таскаемого объекта. Это мелочь. Дальше - хуже.
При клике на объект - прилепить ему мини-тулбарчик (повернуть, скрыть, проч.). ладно, прилепил. При клике на другой объект, логично, что тулбар должен гаситься на старом и отображаться на новом объекте.
Впринципе, это все не трудно реализовать школьными if-ами и перебором всей коллекции объектов Layout'а - на каждом погасить тулбар, а потом высветить на выбраном.
Как это решают белые люди? Не могу связать ваши конечные автоматы со своей задачей.
« Последнее редактирование: 13-08-2010 13:52 от Dimka » Записан
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 13-08-2010 08:52 » 

Цитата: yudjin
Есть класс Layout, на который можно добавлять различные визуальные Object'ы (пока это растровые изображения). Эти Object'ы интерактивны. Ну, в начале было просто - на MouseEnter обводил их рамочкой, на MouseLeave убирал рамочку. Обрабатывал события в самом экземпляре Object. Дальше - хуже.
Когда перетаскиваешь объект - его можно "протащить" под другим, у которого Z-индекс выше, таким образом, срабатывает MouseLeave таскаемого объекта. Это мелочь. Дальше - хуже.
При клике на объект - прилепить ему мини-тулбарчик (повернуть, скрыть, проч.). ладно, прилепил. При клике на другой объект, логично, что тулбар должен гаситься на старом и отображаться на новом объекте.
Белые люди так и делают.
Цитата: yudjin
Впринципе, это все не трудно реализовать школьными if-ами и перебором всей коллекции объектов Layout'а - на каждом погасить тулбар, а потом высветить на выбраном.
Не понял, какой перебор и какие if-ы, если объект имеет события Enter и Leave? По первому он всё включает, по второму выключает - и так каждый объект.

Нужна схема решения в UML или исходный код программы.
« Последнее редактирование: 13-08-2010 08:54 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 13-08-2010 10:49 » 

С переборами и if'ами - старая песня, я просто в лоб решил эту задачу. Сразу же отказался в пользу следующего:
В классе тулбара сделал метод AttachTo(Object). При наведении мыши на объект генерирую событие - его отслеживает Layout и присоединяет тулбар к сендеру-объекту... Пока лучше не придумал. Проблема в том, что можно водить мышью по объекту долго - и все время будет вызываться метод AttachTo(). Считаю, что это неверно, т.е., из этой ситуации есть выход красивее. Можно оставить и так, просто это наглядный (для меня) пример,  он реальный, и если можно улучшить эту модель, то я не хочу упустить возможности набить руку. Получить опыт, так сказать.
Ведь потом нужно прятать тулбар при клике, скажем, по пустой области. Значит назначить Layout'у эту задачу - отслеживать клик по себе, проверять, пусто там или же там растр... У меня наверное изначально неверно модель сформирована.
« Последнее редактирование: 13-08-2010 11:04 от yudjin » Записан
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 13-08-2010 11:42 » 

yudjin, обсуждение бессодержательное. Давай схему или код, с описанием отношения и взаимодействия Layout и Object.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #4 : 13-08-2010 12:09 » 



При событии RasterObj.OnMouseLeftButtonDown() вызываю эвент OnCapture(this). Слой Layer его ловит, устанавливает инициатору тулбар, который в методе AttachTo распологается в зависимости от координат RasterObj'а.
        
Код:
void obj_OnToolBarCapture(RasterObj sender)
        {
            Debug.WriteLine("true");
            toolbar.Visibility = Visibility.Visible;
            toolbar.AttachTo(sender);
        }

В методе RasterObj.OnMouseMove я перемещаю растр по холсту Layer и вызываю у растра событие  MoveTo(newLoc), который ловит тулбар и слой Layer. Первый при этом перемещает себя, второй проверяет на коллизию с другими растрами (цикл по всем дочерним растрам).

Но так как RasterObj не умеет себя рисовать, его рисует слой Layer. Рамка frame так же не может себя рисовать - ее рисует Layer, а в растре я ее просто делаю видимой/невидимой в методах RasterObj OnMouseLeave и OnMouseEnter

Код:
public void AddObject(RasterObj obj)
        {
            obj.OnCapture += new OnCaptureHandler(obj_OnToolBarCapture);
            obj.OnMove += new OnMoveHandler(obj_OnMove);
            this.Children.Add(obj.Raster);
            this.Children.Add(obj.Frame());
        }

Этого всего я не могу на диаграмме пока что отобразить - не хватает знаний, так что прилепил только диаграмму классов.

* Точечный рисунок.JPG (96.56 Кб - загружено 849 раз.)
« Последнее редактирование: 13-08-2010 12:12 от yudjin » Записан
Dimka
Деятель
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 13-08-2010 13:06 » 

Целесообразно вынести всё рисование картинки, рамок и т.п. в сам RasterObj или отдельный объект, являющийся представлением модели. Это позволит внутри Layer сосредоточиться на главном - на взаимном положении областей, занимаемых RasterObj и прочими элементами, на упорядочивании их взаимных наложений и т.п. вещей.

Подробностей этой задачи не знаю, но будто бы для Layer единственным значимым событием является любое изменение в форме и/или месте расположения, или глубине вложенного элемента. На это событие Layer осуществляет перевычисление областей перекрытия и требует от элементов перерисовать себя в нужном для правильного отображения порядке. По меньшей мере многие оконные системы делают именно так. Как себя рисуют окна - их (окон) проблема. Как они реагируют на мышь - их проблема. Layer все эти дела не касаются.
« Последнее редактирование: 13-08-2010 13:09 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
yudjin
Помогающий

ua
Offline Offline
Пол: Мужской

« Ответ #6 : 13-08-2010 13:19 » 

Как себя рисуют окна - их (окон) проблема. Как они реагируют на мышь - их проблема. Layer все эти дела не касаются.
Спасибо, понял куда рыть
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines