Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.07.11;
Скачать: [xml.tar.bz2];

Вниз

Привязка курсора мыши к контролам на форме   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.037 c
1-1118325530
Sicilla
2005-06-09 17:58
2005.07.11
Запуск таймера до создания формы


14-1118226776
YurikGL
2005-06-08 14:32
2005.07.11
USB-разъем под обжимку. Как обжать?


14-1118050027
diwww
2005-06-06 13:27
2005.07.11
отследить, куда пишутся временные файлы


3-1117603888
_Max
2005-06-01 09:31
2005.07.11
Слияние полей в MDB


14-1118732272
reticon
2005-06-14 10:57
2005.07.11
Не резольвятся адреса при пинге....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский