![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы
![]() |
Поиск в этой теме
![]() |
![]() |
#1 |
Пользователь
Регистрация: 15.11.2014
Сообщений: 75
|
![]()
Здравствуйте.
Задача заключается в том, чтобы плавно перетаскивать достаточно большую (2000*2000 пикселей) картинку в jpg формате при зажатии ЛКМ средствами Делфи 2007. Смысл: есть вкладки (реализованные через TPanel, а не через пэйдж контрол, что не есть тру, но на это есть свои веские причины и щас не об этом). На одной из TPanel лежит TImage, в него загружена крупная картинка (конкретно, план местности). Нужно организовать работу с этим планом (перетаскивание с зажатой ЛКМ и масштабирование колесиком мыши). Как я стал решать. Таскать по ОнМаусМув напрямую смысла нет - будет мерцать даже с ДаублБуфферед. Так что кинул на панель СкроллБокс, выставил выравнивание alClient, скроллбары в False (они не должны быть видны), свойство Smooth в тру и уже на него перекинул TImage. Далее записал в обработчик OnMouseMove на картинке: Код:
С удовольствием воспользуюсь вашими советами и отвечу на все вопросы. Проект не выкладываю, т.к. он достаточно крупный и с кучей графики. |
![]() |
![]() |
![]() |
#2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Когда-то я решил это так: http://www.programmersforum.ru/showthread.php?t=104883
У меня были в КБ чертежи формата А4-А0, а это огромные простыни. Так что рекомендую выкинуть Image в пользу другого.
I'm learning to live...
|
![]() |
![]() |
![]() |
#3 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
![]()
Мне кажется, что нужно сохранять предыдущую позицию и передавать разность между ними.
В разработке: воспроизводственный контур ИТ
|
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 15.11.2014
Сообщений: 75
|
![]()
Ну я так и подумал, что TImage в моем случае похож на слона в посудной лавке: громоздкий, неуклюжий и ничо с ним быстро и просто не сделаешь.
Хорошо, выкину, хотя теплилась надежда сделать все максимально просто, быстро и без доп. компонентов. Задача, на самом деле, немного шире. На плане в некоторых местах нужно будет накладывать небольшие картиночки-маркеры (максимум, 128*128 пикселей) и желательно в пнг. Изначально Делфи 2007 с этим форматом работать не умеет, но когда-то давно я уже ставил компонент, благодаря которому появлялась возможность работать с альфа-каналом, так что не вопрос. А план будет один-единственный и будет забит в прогу изначально, поэтому быстрая загрузка изображений мне не нужна. Нужны всего несколько вещей: - плавное перетаскивание по зажатию ЛКМ; - плавное зуммирование по колесику мыши; - отрисовка специальных маркеров (желательно отдельным слоем, чтоб при зуммировании они не меняли своего размера, но это не критично). Vapaamies, Правильно, но тогда не будет двигаться картинка во время ОнМаусМув. Она будет отрисовываться только, когда отпускается клавиша, а мне нужно картинку привязать к курсору. |
![]() |
![]() |
![]() |
#5 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
![]()
Нужно сохранять те X и Y, которые передаются в обработчик. Суть в том, что ScrollBy хочет дельты смещения, а в обработчик поступают точечные координаты. Чтобы получить смещение, нужно провести линию между двумя точками во времени и пространстве, для чего значение предыдущей точки нужно сохранить.
В разработке: воспроизводственный контур ИТ
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 15.11.2014
Сообщений: 75
|
![]()
Решение нашел, все умещается в две с половиной строчки кода, а я, как обычно, не то и не туда прибавлял, тем более, что вычитать нужно было ))
Все прокручивается плавно, не мерцает и вообще замечательно. Пока не знаю, что там с зумом и маркерами будет, но дополнительный компонент постараюсь не ставить до упора. Код:
imgMap - это TImage с загруженной картинкой. Факультативно можно добавить ограничители в СкроллБай, чтоб картинку нельзя было перетащить за пределы формы. Последний раз редактировалось exyl; 16.11.2014 в 02:46. |
![]() |
![]() |
![]() |
#7 |
Просветитель
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,844
|
![]()
Раз уж взялся делать по-человечески, иди до конца. Начальную точку нужно хранить в виде полей private-секции формы, а не в глобальных переменных.
В разработке: воспроизводственный контур ИТ
|
![]() |
![]() |
![]() |
#8 | |
Пользователь
Регистрация: 15.11.2014
Сообщений: 75
|
![]() Цитата:
На самом деле, она у меня там и прописана. Но к тебе у меня вопрос. А как тогда назвать такую переменную? Локальной? А как же тогда переменные внутри функций? "Локально-локальные" или "совсем локальные"? )) Так вот, все переменные, объявленные за пределами функций или процедур называются глобальными. Только одни (в секции public) могут использоваться из других форм, а другие (в секции private) - нет. Так что возьми самоучитель с основами терминологии и выучи базу, чтоб потом не попадать в глупые ситуации. |
|
![]() |
![]() |
![]() |
#9 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]() Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
![]() |
![]() |
![]() |
#10 | |
Пользователь
Регистрация: 15.11.2014
Сообщений: 75
|
![]() Цитата:
Но это вопрос терминологии, а у меня есть вопрос по теме. Дошло дело до зума. Есть код. Процедуру описал в private, как и константу MAP_ZOOM_NUM, которая нужна для определения количества приближений/отдалений от плана и равна 5. MAP_ZOOM тоже из private, типа byte и туда заносится текущий порядковый номер зума (от 0 до MAP_ZOOM_NUM), соответственно при MAP_ZOOM=5 зум наименьший (самое сильное уменьшение картинки), а если =0, то зума нет (оригинальный размер). ZOOM_MAP_POINT - это TPoint из private, в который пишутся координаты курсора относительно картинки в OnMouseMove Image1. Код:
Задача геометрическая, но я никак не могу сообразить. Есть ширина/высота самой картинки и окошка, в котором она отображается. Есть топ/лефт картинки. Закомментированные строки кода - это как раз те места, где нужно вписать формулу для пересчета. Загвоздка одна - я не могу сообразить, как она будет выглядеть. Последний раз редактировалось exyl; 16.11.2014 в 12:10. |
|
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Определение размера файлов большого размера | stpdqstns | Общие вопросы C/C++ | 4 | 13.03.2013 11:50 |
плавное появление/исчезновение объекта TImage | Хамяг | Общие вопросы Delphi | 2 | 04.12.2011 01:14 |
Плавное изменение размера формы | TaTT DoGG | Общие вопросы .NET | 5 | 31.03.2010 16:53 |
Перетаскивание файла из ShellListView в TImage | Fakov | Общие вопросы Delphi | 1 | 31.01.2010 22:56 |
Сохранение книги большого размера. | nemoomen | Microsoft Office Excel | 12 | 22.03.2009 05:57 |