![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выделение объекта по щелчку мышки [D7, WinXP]
Pavor © (2005-11-23 10:06:00)Приветствую, уважаемые профессионалы!
Пишется программа, что-то вроде специального векторного графического редактора. В памяти элементы содержатся в динамическом массиве Items, структура следующая
type TNode= record
x,y: integer;
end;
type TBranchType= (PLAIN, DC_EMF, DC_R);// значения для типа ветви
// PLAIN - без элементов ("закоротка")
// DC_EMF - ЭДС постоянного тока
// DC_R - резистор постоянного тока
type TItems=record
Node1,Node2: TNode;
BranchType: TBranchType;
Selected: Boolean;
end;
var Items: array of TItems;
При событии OnPaint массив сканируется и все элементы отрисовываются в соответствии со своим типом.
Вопрос в следующем: как узнать, что по объекту произведен щелчек мышкой? То есть, на входе X,Y курсора, а на выходе - установленные свойстваSelectedв массиве.
Огромная просьба описать подход, либо дать ссылку, где можно почитать материал на эту тему. Заранее спасибо.
Pavor (2005-11-23 11:50:00) [1]2 clickaker:
О! Вот и ссылка! Спасибо, пойду почитаю...
clickmaker (2005-11-23 11:32:00) [2]
>
> резистор = отрезок-прямоугольник-отрезок, тьфу ты
в общем случае - регион
см. в MSDN про регионы и PtInRegion()
Pavor (2005-11-23 11:18:00) [3]
> (резистор = отрезок-прямоугольник-резистор),
резистор = отрезок-прямоугольник-отрезок, тьфу ты :))))
Pavor (2005-11-23 11:16:00) [4]2 Плохишь:
> Ты, эта, думалку включать не пробовал? Намекаю, объекты
> обычно кроме координат x и y ещё имеют длину и ширину, плюс
> ко всему могут, наверное, перекрывать друг друга.
Пробую помаленьку, пока не заводится :)
То есть получается, все ветви составными делать (резистор = отрезок-прямоугольник-резистор), еще и счетчик "уровня" для каждой ветви... Спасибо, вроде подтолкнул, может поедет даже ;)
А у кого еще идеи есть? О:-)
Плохиш (2005-11-23 10:52:00) [5]
> Pavor © (23.11.05 10:48) [3]
> 2 clickmaker:
>
> > ТоНаЧемРисуется.OnMouseDown
> > ну а дальше поиск по массиву со сравнением X,Y c Node.
> x,
> > y
>
>
> Я прошу прощения, чего-то не понял: ну проверил, совпадений
> нет - это же значит, что курсор не попал на начало/конец
> ветви? А с объектом как?
Ты, эта, думалку включать не пробовал? Намекаю, объекты обычно кроме координат x и y ещё имеют длину и ширину, плюс ко всему могут, наверное, перекрывать друг друга.
Pavor (2005-11-23 10:48:00) [6]2 clickmaker:
> ТоНаЧемРисуется.OnMouseDown
> ну а дальше поиск по массиву со сравнением X,Y c Node.x,
> y
Я прошу прощения, чего-то не понял: ну проверил, совпадений нет - это же значит, что курсор не попал на начало/конец ветви? А с объектом как?
2 MBo:
С цветами здорово, конечно :), но, наверное, это не подходит.
Всякие Компасы с Автокадами же работают, может кто-нить знает все-таки, как сделать?
MBo (2005-11-23 10:10:00) [7]Если элементов много, и форма у них может быть сложная, то удобен и быстр такой метод - все рисуется на битмапе, каждый элемент - уникальным цветом, например, цвет=индексу элемента. Затем просто проверяешь цвет в точке нажатия.
clickmaker (2005-11-23 10:08:00) [8]
> Вопрос в следующем: как узнать, что по объекту произведен
> щелчек мышкой?
ТоНаЧемРисуется.OnMouseDown
ну а дальше поиск по массиву со сравнением X,Y c Node.x, y