| | | | |
Компонент "Горячая область" | Полный текст материала
Другие публикации автора: Петр Смирнов
Цитата или краткий комментарий: «... Давным давно, в языке HTML появилась возможность задавать карты "горячих областей". Это, как правило, рисунки, на которых отмечались некоторые зоны (те самые "горячие области"), нажатие на которые приводило к нужному эффекту. Область применения подобных вещей весьма широка. Хотелось бы иметь на Delphi что-то подобное? Наверное, было бы такое сделать неплохо. Разумеется, ложить на форму WebBrowser было бы чересчур для такой простой задачи. Я предлагаю альтернативное решение - использовать предлагаемый компонент. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
Отслеживать это обсуждение
Всего сообщений: 1118-11-2008 09:50сообщение от автора материала >>> что 8-битный TBitmap создаёт утечку ресурсов
Предполагается, что компонент используется в качестве основного "окна" программы. Это значит, что он создается и уничтожается один раз за все время работы программы. Утечка ресурсов при освобождении не принципиальна - Windows XP подчистит за программой везде, где нужно, а раритет, вроде Windows 98 я не особенно рассматривал (правда, MaskBlt, неправильно функционирующий в Windows 98 я все-таки переработал). |
|
17-11-2008 08:56На всякий случай, напомню, что 8-битный TBitmap создаёт утечку ресурсов. Исправлено, вроде, только в D2007. |
|
17-11-2008 01:24сообщение от автора материала Компонент сделан для начинающих программистов под задачу, поставленную в максимально общем виде. А для задач, поставленных в общем виде, решение не может быть сделано достаточно эффективным. Да, можно ограничить себя - только полигоны в качестве горячих областей, только области без внутренних элементов (или как в HTML - срабатывает первая кликнутая область). Но для профессиональных программистов это не является проблемой - они напишут собственное, высокоэффективное решение, эффективное именно для данного случая. Да, может быть, я пририсую к компоненту возможность задавать маску как набор полигонов. Но размер картинок это не уменьшит, а именно они (3*24 битные против 1*8 битной) - так что эффективность (в смысле расхода памяти) будет мизерная. |
|
14-11-2008 08:01Конечно, растёт расход памяти, но тут опять же, есть а) PNG8 б) GIF.
Они в таком виде существуют только на диске, после загрузки в память они всеравно преобразуются в битмап+маска и занимают ровно столько же памяти.
В отличии от прилагаемой карты, рисунок я сделаю ЗНАЧИТЕЛЬНО быстрее.
А как же масштабирование? На одном мониторе форма не поместится на экран, на другом будет слишком мелким изображение... Регионы же, масштабировать можно без потерь и на лету. Да и как правило такие "маски" строятся лишь один раз на протяжении всего проекта, и иногда лишь корректируются.
Метод всем хорош, но а) требует внешнего редактора......
Надо заметить, что метод с битмапом так же требует внешнего редактора.
>>> откуда берутся утилиты требующие на диске 160Мб места
Это Вы про что, про программы, которые могут быть написаны с использованием моего компонента?
Я про такой подход в целом. Как впрочем и про использование калькулятора в качестве молотка.
То что есть избыток ресурсов, не означает что их нужно непременно использовать но чтобы побыстрее сделать и отдать. |
|
13-11-2008 09:23я бы все же выбрал вектоную графику и регионы, а не битмап. Ну, жалко мне памяти. ПМСМ еще не известно, что реально будет больше отъедать. Количество оперативки, да и дисковой памяти растёт семимильными шагами, а вот количество хэндлов постоянно: 10000. |
|
13-11-2008 09:02Как то раз один парень, считавший себя программистом, доказывал мне преимущество какой-то навороченной библиотеки, в которой есть возможность создавать кнопки произвольной формы. На что я возразил в том ключе, что в этом нет ничего сложного. И в качесте доказательства за 10 минут написал программу, в которой для примера была нарисована клавиша Enter с клавиатуры (типа, с "загогулиной"). Парнишка сначала ее понажимал мышкой а затем, чтобы меня уесть, кликнул мышкой в пределах BoundsRect но не на кнопке, а на фоне. Он уже предвкушал, как выскажет мне все о моих кривых руках, но был разочарован: кнопка не нажалась.
Думаю, не стоит говорить, что был использован именно этот прием как наиболее простой в реализации.
В общем, прием имеет право на существование. Например, в приложениях, имеющих одну слоожную навороченную форму. Но для программного комплекса в котором имеется много форм и во всех должны использоваться горячие области, я бы все же выбрал вектоную графику и регионы, а не битмап. Ну, жалко мне памяти.
Да, потребуются специальные инстументы для задания областей. Ну, так мы программитсы или где? Неужели графредактор простенький для себя не напишем? ;-) Хотя я встречал решения, когда сложная кривая область апроксимировалась обычной ломаной с относительно небольшим количеством вершин: точность была не очень, но для работы хватало. |
|
12-11-2008 22:30"Ложить" - очень показательный признак. Не стоит недооценивать замечание. |
|
12-11-2008 20:09Дорогой сэр! Отличная идея (хотя и использовавшаяся в старых играх в чуть другом виде) использовать цвет пикселя для определения региона клика. Офигенная идея. Мы в своих проектах используем собственный редактор, который позволяет накликивать точки, сохраняя их массив, загружать в игре, и создавать средствами Windows API регионы сложной формы. Метод всем хорош, но а) требует внешнего редактора б) очень сложно согласовывать программиста с дизайнером в) есть сложности при определении регионов с дырками и вложенных регионов.
Ваша технология же проста и логична. Спасибо за идею. Уверен, масса геморроя уходит - дизайнер сможет рисовать маски САМ, и сразу тестировать их. Конечно, растёт расход памяти, но тут опять же, есть а) PNG8 б) GIF. |
|
12-11-2008 14:33сообщение от автора материала >>> то зачем хранить маску когда область можно задавать полигонами
Смысл именно в том, чтобы задавать области сколь угодно сложной формы. Хоть огурец, как показано в приведенном примере. Без лишнего, извините, геморроя. В отличии от прилагаемой карты, рисунок я сделаю ЗНАЧИТЕЛЬНО быстрее. И будет он нагляднее (для программиста). И занимает он немного места - 8 битного цвета, 256 областей Вам выше крыши хватит.
>>> Аффтар, не ложить, а класть!
Засавывать, запихивать и впаривать! Креатифф гениален... а вообще, я не сторонник разводить на страницах Королевства филиал Удава.
>>> откуда берутся утилиты требующие на диске 160Мб места
Это Вы про что, про программы, которые могут быть написаны с использованием моего компонента? Так извините меня, Эйнштейн тоже не думал, что его работы будут использованы для разрушения Хиросимы и Нагасаки. |
|
12-11-2008 13:07>> Разумеется, ложить на форму WebBrowser было бы чересчур для такой простой задачи. Я предлагаю альтернативное решение — использовать предлагаемый компонент
Аффтар, не ложить, а класть! Пешы исчо!!!Сообщение не подписано |
|
12-11-2008 03:37Теперь понятно откуда берутся утилиты требующие на диске 160Мб места, когда как реально уложится в 1-2Мб....
Конечно хорошая идея, но реализация... всетаки, согласитесь если делать это все константами, то зачем хранить маску когда область можно задавать полигонами? а сами изображения простыми эффектами обрабатывать на лету, тогда можно обойтись одной единственной картинкой, которую собственно и надо выводить. |
|
|
|