Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API | GDI. Как определить, что пользователь кликнул в объект

Ответить
Настройки темы
Win32 API | GDI. Как определить, что пользователь кликнул в объект

Аватара для XCodeR

Ветеран


Сообщения: 878
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


Ищу документацию.... Гугл дал не много...

+ вопрос:
как можно определить, что на нарисованный объект(прямоугольник, линия и т.д. и т.п.) пользователь кликнул мышкой?
допустим рисовали на TCanvas

среда разработки, как всегда C++ Builder || Delphi.

Отправлено: 11:41, 25-07-2006

 

Новый участник


Сообщения: 35
Благодарности: 0

Профиль | Отправить PM | Цитировать


Допустим, ты рисуешь на канве формы. Хотя, это не имеет значения. Ты знаешь координаты своего объекта. Для прямоугольника достаточно знать координаты верхнего левого угла и правого нижнего. Теперь в обработчике OnMouseDown (или OnMouseUp) проверяй координаты X, Y, которые передаются в обработчик события, на то, находится ли точка с этими координатами внутри объекта или нет. Для прямоугольника это будет примерно так:
if ((X>LeftCorner.X)&&(X<RightCorner.X)&&(Y>LeftCorner.Y)&&(Y<RightCorner.Y))
{
//Сюда попадем, если точка внутри прямоугольника
};
LeftCorner и RightCorner - структуры типа POINT, содержащие координаты точек (Левого и правого углов)
Для круга проверка по формуле (X-Xc)^2+(Y-Yc)^<=R^2. Xc и Yc - координаты центра круга. Правда, для сложных фигур (типа замкнутых фигур, состоящих из кривых Безье) такую проверку будет сделать сложновато.
По GDI советую читать MSDN.

Отправлено: 13:36, 25-07-2006 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для XCodeR

Ветеран


Сообщения: 878
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


LeonidPr
спасибо, но в моем случае "рисованных" объектов будет большое количество. и проверка таким образом может занять драгоценное время.
Цитата:
По GDI советую читать MSDN.
что и делаю...

Отправлено: 14:16, 25-07-2006 | #3


Ветеран


Сообщения: 1647
Благодарности: 146

Профиль | Отправить PM | Цитировать


По GDI есть книжечка: Фень Юань, "Программирование графики для Windows". Есть электронная версия русского перевода, не помню уже, где скачал.

Отправлено: 21:27, 25-07-2006 | #4


Аватара для XCodeR

Ветеран


Сообщения: 878
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


XPEHOMETP
а выложить куда - нибудь или отправить на почту , можешь?

Отправлено: 00:29, 26-07-2006 | #5


Ветеран


Сообщения: 1647
Благодарности: 146

Профиль | Отправить PM | Цитировать


XCodeR
Цитата:
а выложить куда - нибудь или отправить на почту , можешь?
Муторно из дома по модему посылать, файл большой. Поищи в Гугле, по названию, я так нашел, где скачать. Если не получится, когда буду на работе, то выложу или пришлю.

Отправлено: 23:54, 27-07-2006 | #6


Аватара для XCodeR

Ветеран


Сообщения: 878
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


XPEHOMETP
ок. посмотрю(поищу)...

Отправлено: 11:41, 28-07-2006 | #7


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Сабж - это на самом деле нетривиальная задача. Я решал её уже несколько раз, каждый раз - заново. Всё очень сильно зависит от реализации.

1. Кто определяет "попал-не попал?" Если каждый объект сам для себя - это одно. Если некто вроде "менеджера объектов" - это другое.
2. Алгоритмы вычисления "попади в прямоугольник" сильно отличаются от алгоритмов "кликни в полилинию". ОЧЕНЬ сильно.

Отправлено: 16:30, 28-07-2006 | #8


Аватара для XCodeR

Ветеран


Сообщения: 878
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


hasherfrog
Может быть, если я опишу задачу, станет понтянее, что я хочу.

Рисуется несколько объектов(по форме напоминающих квадрат), координаты которых берутся из БД. Между объектами может быть проведена линия.
Так вот у каждого нарисованного объекта и возможной между ними линии есть определенные свойства, которые пользователь может редактировать.
=> что отредактировать свойства объекта пользователь кликает на объект.
Итого задача - определить на какой объект(линию) кликнул пользователь.

На данный момент решено(еще до создания темы) при помощи проверки попадает ли координаты "клика" в "прямоугольник координат" объекта.(для линии пока не решал, но проблем вроде как возникнуть не должно, формулы линии(=прямой) благо вывели задолго до нас)

Но так как объектов может быть очень много боюсь, что это скажется на работоспособности.

Цитата:
Алгоритмы вычисления "попади в прямоугольник" сильно отличаются от алгоритмов "кликни в полилинию". ОЧЕНЬ сильно.
впринципе можно решить при помощи формул ограничивающих многоугольник прямых.... если "полилиния" - многоугольник.
с кривыми Безье, как уже отмечалось в этой теме - все намного сложнее.

Отправлено: 23:51, 28-07-2006 | #9


Аватара для hasherfrog

Старый параноик


Сообщения: 2423
Благодарности: 85

Профиль | Отправить PM | Цитировать


Почему я упомянул про 1. Давным-давно (лет двенадцать назад) я решал такую задачу. Есть карта Москвы, улицы - полилинии, дома даны в виде полигонов (не путать с полилинией), у каждого свой Id, координаты в базе. Надо определить, куда попал пользователь мышой, выдать подпись "Улица/дом". Очевидно, что объектов очень много, поэтому было использована технология (громко сказан :]) нескольких "окон".

Ещё до вывода, до отрисовки, вообще "до", в самом формировании базы, все дома (точнее, прямоугольники, куда входили полигоны домов) отфильтровывались по оси Y. У каждого дома, дополнительно, в соответствии с его ID, хранился прямоугольник boundaries, ы который "вписывался дом". При выводе на экран бинарным деревом отфильтровывались Id тех ненужных домов, которые оказывались вне экранного окна по Y (min/max окна). Потом отфильтровывались (емнип, тупым перебором) по данным прямоугольников boundaries дома оставшиеся - теперь выкидывались те, кто оказался вне экрана по оси X. Из оставшихся формировался список Idэшек, который хранился до тех пор, пока пользователь не сменит масштабирование/не проскроллит экран. По этому списку дома отрисовывались, если надо было перерисовать экран.

Когда пользователь кликал мышой, координата пересчитывалась в реальные. Этот XY использовался для отфильтровки из "хранимого" Id-списка всех тех "близлежащих" домов, прямоугольные boundaries которых содержали в себе тыкнутую точку. Потом начиналось самое дурацкое - определение "попал-не-попал" для полигона и точки. Сейчас я (вот прямо сейчас :] ага. Нет уж, когда время будет и когда доки дпишу китайцам) ищу/пишу нормальный алгоритм того же самого, потому что старые (подсчёт и анализ количества точек пересечений всех сторон полигона с горизонтальной осью x=x_точки_тыка слева от y_точки_тыка) меня перестал устраивать. Правда, сегодняшняя задача у меня много проще, нет такого количества данных, примитивный coreldraw :]

Когда-то (это уже лет пять назад) я писал в AutoCAD, с использованием ихнего :] API, там было всё круто насчёт определения очки пересечения отрезков - это было вшито в библиотеки и работало как электровеник. Но во реализация и алгоритм их мне не известен, поэтому у меня свой :]

***

Что касается вопроса 2. Для линий всё немного проще. Вы (ну в смысле я) делаете небольшой виртуальный крестик из двух отрезков, превращая точку в плюсик. И у двух отрезков данного плюсика ищете точки пересечения с отрезками из заданной полилинии (с минимальной двухуровневой оптимизацией. основанной на тех же "окнах": окно всей полилинии vs boundaries крестика и окна отрезков крестика vs каждый отрезок полилинии при поиске точки тересечения). Если пересечение есть, считаете, что пользватель "попал". Можно брать не крестик, а квадратик (если мышиный курсор у Вас не квадратик, а стрелочка, лучше брать всё-таки "плюсик-крестик").

***


Вот по поводу именно GDI - я не знаю. У меня всегда расчёт шёл в double-числах, может, для integer'ов можно как-то всё ещё прооптимизировать...

бинарным деревом :D чё сказал?
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:04, 29-07-2006 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Win32 API | GDI. Как определить, что пользователь кликнул в объект

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Win32 API | Нужна помошь по API функциям! vasika_hk Программирование и базы данных 2 23-05-2006 09:51
Win32 API | Дозвон XCodeR Программирование и базы данных 5 08-04-2006 12:26
Win32 API | Как найти контрол в окне xCarrot Программирование и базы данных 1 05-07-2005 13:45
Win32 API | Неизвестные функции Savant Программирование и базы данных 9 02-03-2005 10:18
Win32 API | Как разделить радиокнопки? Savant Программирование и базы данных 2 01-03-2005 10:37




 
Переход