Показать полную графическую версию : Создание на Delphi компонентов с непрямоугольной областью реакции на события мыши
Мне надо на дельфях сделать компоненты в стиле автокада типа линия, ломаная линия сплайн и т.д., но не просто нарисовать, а чтоб они были обьектами, их можно было бы зацепить мышей и перетащить, изменить и т.д..
Подскажите как это реализовать, плиз! ОЧЕНЬ НАДО!!!
daddysam
25-11-2007, 22:07
ну и зделай их объектами.
Создай класс у которого будут свойства описывающие твою кривую
а также rect описывающий область в которой нарисована эта кривая.
затем в событии нажатия кнопки мыши проверяешь координаты, не попала ли она в область описанную в свойстве rect
если попала то в событии движения мышки смещаеш координаты rect в соответствии с координатами передвижения мышки.
ну а в тонкостях думаю разберёшся.
незабудь перерисовать объект когда отпутишь мышку
ОК! а когда такая ситуация, что таких обджектов куча (как в автокаде) и тот который получил событие считает что не он его должен обработать, как ему передать событие "нижнему" по зет порядку обьекту, а тот может быть передаст его еще более "нижнему" или сам обработает!?
BlackEric
26-11-2007, 14:05
Тогда наверное разумно ввести понятие слоя. И делать так чтобы в одном слое кривые (объекты) не накладывались друг на друга.
Как вариант можно посмотреть как это реалиазовано в каком нибудь открытом векторном редакторе. И здесь же я так понимаю у вас еще встанет проблема сохранения всего этого в файл для последующего редактирования. Cледовательно вам прийдется либо избретать свой формат, либо брать уже готовый открытый векторный и смотреть как это реализовано там.
P.S. А зачем вам это нужно, коль не секрет???
daddysam
26-11-2007, 17:28
Не ребят ну всё достаточно просто. Не могут же области перекрывать другдруга полностью достаточно попасть в область не занятую другими объектами. а если же перекрыли то не обессутьте оттащите объект в сторону и занимайтесь нижним. а понятие слоя обязательно. У тебя должен быть масив объектов. перебирая его в событиях ты и будишь манипулировать объектами. а положение в этом мосиве и будет определять уровень слоя по принципу последний элемент верхний слой. можно реализовать функцию перемещения слоя вверх вниз. по такому принцыпу помоему построены все редакторы.
удачи в разработке былобы интересно посмотреть что получиться в итоге
P.S. А зачем вам это нужно, коль не секрет??? »
Да именно надо создать небольшой векторный графический редактор. Типа рисовать линии, кривые с возможностью изменять масштаб.
Как вариант есть идея создать холст, на нём рисовать, но чтоб холст, опрашивая свои объекты (линии, кривые и т.д.) сам принимал решение за то с каким контролом надо работать. Единственное что мне не очень понятно то то как организовать перерисовку нужной части холста не мучаясь с перерисовкой всего холста... Что посоветуете?
P.S. А зачем вам это нужно, коль не секрет??? »
Да именно надо создать небольшой векторный графический редактор. Типа рисовать линии, кривые с возможностью изменять масштаб.
Как вариант есть идея создать холст, на нём рисовать, но чтоб холст, опрашивая свои объекты (линии, кривые и т.д.) сам принимал решение за то с каким контролом надо работать. Единственное что мне не очень понятно то то как организовать перерисовку нужной части холста не мучаясь с перерисовкой всего холста... Что посоветуете?
BlackEric
02-12-2007, 13:16
Если на VCL - то я бы попробовал использовать PaintBox. Там можно без особых проблем перерисовывать часть изображения.
Т.е. там можно копировать область с заданными прямоугольными координатами.
Если же нужны градиентные заливки, текстуры и прочее, то я бы смотрел в сторону OpenGL/DirectX.
Есть не плохие книги Краснова по работе с OpenGL/DX из Delphi.
Ок! Спасибо всем! Буду пробовать!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.