![]() |
Создание на Delphi компонентов с непрямоугольной областью реакции на события мыши
Мне надо на дельфях сделать компоненты в стиле автокада типа линия, ломаная линия сплайн и т.д., но не просто нарисовать, а чтоб они были обьектами, их можно было бы зацепить мышей и перетащить, изменить и т.д..
Подскажите как это реализовать, плиз! ОЧЕНЬ НАДО!!! |
ну и зделай их объектами.
Создай класс у которого будут свойства описывающие твою кривую а также rect описывающий область в которой нарисована эта кривая. затем в событии нажатия кнопки мыши проверяешь координаты, не попала ли она в область описанную в свойстве rect если попала то в событии движения мышки смещаеш координаты rect в соответствии с координатами передвижения мышки. ну а в тонкостях думаю разберёшся. незабудь перерисовать объект когда отпутишь мышку |
ОК! а когда такая ситуация, что таких обджектов куча (как в автокаде) и тот который получил событие считает что не он его должен обработать, как ему передать событие "нижнему" по зет порядку обьекту, а тот может быть передаст его еще более "нижнему" или сам обработает!?
|
Тогда наверное разумно ввести понятие слоя. И делать так чтобы в одном слое кривые (объекты) не накладывались друг на друга.
Как вариант можно посмотреть как это реалиазовано в каком нибудь открытом векторном редакторе. И здесь же я так понимаю у вас еще встанет проблема сохранения всего этого в файл для последующего редактирования. Cледовательно вам прийдется либо избретать свой формат, либо брать уже готовый открытый векторный и смотреть как это реализовано там. P.S. А зачем вам это нужно, коль не секрет??? |
Не ребят ну всё достаточно просто. Не могут же области перекрывать другдруга полностью достаточно попасть в область не занятую другими объектами. а если же перекрыли то не обессутьте оттащите объект в сторону и занимайтесь нижним. а понятие слоя обязательно. У тебя должен быть масив объектов. перебирая его в событиях ты и будишь манипулировать объектами. а положение в этом мосиве и будет определять уровень слоя по принципу последний элемент верхний слой. можно реализовать функцию перемещения слоя вверх вниз. по такому принцыпу помоему построены все редакторы.
удачи в разработке былобы интересно посмотреть что получиться в итоге |
Цитата:
Как вариант есть идея создать холст, на нём рисовать, но чтоб холст, опрашивая свои объекты (линии, кривые и т.д.) сам принимал решение за то с каким контролом надо работать. Единственное что мне не очень понятно то то как организовать перерисовку нужной части холста не мучаясь с перерисовкой всего холста... Что посоветуете? Цитата:
Как вариант есть идея создать холст, на нём рисовать, но чтоб холст, опрашивая свои объекты (линии, кривые и т.д.) сам принимал решение за то с каким контролом надо работать. Единственное что мне не очень понятно то то как организовать перерисовку нужной части холста не мучаясь с перерисовкой всего холста... Что посоветуете? |
Если на VCL - то я бы попробовал использовать PaintBox. Там можно без особых проблем перерисовывать часть изображения.
Т.е. там можно копировать область с заданными прямоугольными координатами. Если же нужны градиентные заливки, текстуры и прочее, то я бы смотрел в сторону OpenGL/DirectX. Есть не плохие книги Краснова по работе с OpenGL/DX из Delphi. |
Ок! Спасибо всем! Буду пробовать!
|
Время: 06:48. |
Время: 06:48.
© OSzone.net 2001-