Текущий архив: 2005.07.11;
Скачать: CL | DM;
ВнизПривязка курсора мыши к контролам на форме Найти похожие ветки
← →
Nike (2005-06-10 14:31) [0]Здравствуйте! Ситуация такова: на форме есть TPanel, на к-й размещаются объекты TShape. Мне необходимо, чтобы при приближении мыши к углам ТShape-ов (скажем на расстояние до 5 пикселов) срабатывала привязка - курсор "становился на угол" соответствующего TShape-а (При этом курсор мыши необязательно будет находиться именно над этим Тшейпом - он может быть и над другим шейпом и над панелью)
Как это можно осуществить в Delphi 7 наиболее рациональным способом?
← →
Nike (2005-06-10 14:44) [1]...Привязка должна происходить во время выполнения программы (run-time, а не design)
← →
TUser © (2005-06-10 14:58) [2]Обрабатывать OnMouseMove
← →
Nike (2005-06-14 12:38) [3]
> TUser © (10.06.05 14:58) [2]
> Обрабатывать OnMouseMove
Интересный совет. Поясните, пожалуйста.
У чего обрабатывать это событие? Ведь мышь может находиться как над Шейпом в нужной зоне (вблизи вершины), так и над панелью (рядом с вершиной).
← →
TUser © (2005-06-14 12:43) [4]Обрабатывать OnMouseMove у панели. Если расстояние до шейпа меньше порога - помещать мышь на шейп (см. св-ва объекта Mouse).
← →
Digitman © (2005-06-14 12:49) [5]некрасивое дело ты задумал.
не заставлять курсор "скакать", это крайне неприятно для юзера.
при входе в "зону" просто зафиксируй этот факт установкой некоего внутреннего флага и измени изображение курсора на нужное
← →
-=XP=- © (2005-06-14 12:51) [6]Создать базовый графический примитив, со свойствами и поведением:
1. procedure Draw; virtual; - для перерисовки примитива;
2. function IsPointOnBorder(const APoint: TPoint): boolean; - для определения, находится ли мышь над границей;
3. прочее, прочее, прочее...
Породить этот базовый класс можно от TObject. Так же долже быть реализован специальный класс - владелец, на котором, собственно, примитивы будут "жить" - отрисовываться, и который будет обеспечивать эти примитивы событиями от мыши (диспетчеризировать). Все остальные примитивы (окружности, прямоугольники, полигоны) порождаются от этого базового примитива.
При создании, экземпляр класса должен регистрироваться у владельца. Владелец, при получении события от мыши (например, OnMouseMove), пробегается по списку зарегистрировавшихся примитивов, и, обнаружив, что мышь находится над границей одного из них (IsPointOnBorder) - сообщает примитив об этом (как угодно, хоть сообщение передавать). Примитив отрабатывает это событие заранее прописанным способом.
То-есть, реально событие от мыши в любом случае обрабатывать будет владелец. А уж кому он его потом передаст - зависит от того, какой примитив откликнется.
В общем, как обычно.
← →
Nike (2005-06-21 11:56) [7]
> -=XP=- ©
Спасибо, буду пробовать.
← →
Nike (2005-06-21 12:00) [8]
> Digitman ©
Я хочу сделать "привязку" похожей на используемую в Автокаде. Там она именно так и работает - подводишь мышь к объекту, он ее "притягивает" и загорается желтенький значок привязки над точкой. И по-моему для Автокада, как графического редактора, это удачное и удобное решение.
← →
Nike (2005-06-21 12:03) [9]
> -=XP=- ©
У меня родился к вам вопрос. Почему в функции IsPointonBorder аргумент aPoint объявлен как константа? Что дает использование слова const?
← →
Юрий Зотов © (2005-06-21 13:14) [10]> Nike (21.06.05 12:03) [9]
> Что дает использование слова const?
Параметр будет передан не по значению, а по ссылке, как и в случае var - но с тем отличием, что менять его внутри процедуры все равно будет нельзя, не пропустит компилятор. Обычно используется для экономии места в стеке, когда надо передать параметр размером более 4 байт, но так, чтобы на выходе из процедуры он остался гарантированно неизменным.
← →
vl_chel © (2005-06-21 14:47) [11]2 -=XP=- © (14.06.05 12:51) [6]
Желательно все примитивы унаследовать от одного класса и пп 1 и 2 в нем сделать абстрактными. Все примитивы нужно хранить в одном списке и перебирая список находить нужный.
2 Nike (21.06.05 12:00) [8]
в автокаде курсор мыши не скачет, а только прорисовывается знак привязки
Страницы: 1 вся ветка
Текущий архив: 2005.07.11;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.036 c