Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Пт 18 Мар 2011 16:02 Заголовок сообщения: Простой (надеюсь) вопрос по координатам мышки |
|
|
Прошу прощения за, видимо, ламерский вопрос, но как получить в расширении координаты мышки относительно нуля карты (можно по щелчку, а можно и в динамике?) В библиотеке есть модули "MouseMove" "MouseDown", но как их вызвать, чтобы они работали? У меня есть знаменитый документ по GIS API, и список методов, но что-то извилин не хватает ими воспользоваться. Либо возвращает мусор, либо дает аварийную ошибку... Нельзя ли как-нибуль популярно, в двух (ну или двадцати двух) словах? |
|
Вернуться к началу |
|
|
Михаил Власов
Зарегистрирован: 14.02.2005 Сообщения: 580 Откуда: ИНТЕГРО
|
Добавлено: Пн 21 Мар 2011 10:06 Заголовок сообщения: Re: Простой (надеюсь) вопрос по координатам мышки |
|
|
Например, так:
Код: | ' Вызывается при нажатии клавиши мыши над окном карты
sub MapEditors_MouseDown(aButton, aShift, aX, aY)
dim aWorldX, aWorldY
Application.MainWindow.MapWindow.Surface.sPointDeviceToWorld aX, aY, aWorldX, aWorldY
MsgBox _
"Координаты в пикселах окна карты: " & aX & " " & aY & vbNewLine & _
"Координаты в системе координат территории: " & aWorldX & " " & aWorldY
end sub |
_________________ С уважением, Михаил Власов. |
|
Вернуться к началу |
|
|
Foton
Зарегистрирован: 09.10.2006 Сообщения: 158 Откуда: Ярославль
|
Добавлено: Пн 21 Мар 2011 12:33 Заголовок сообщения: |
|
|
Код: |
unit PointEditor;
interface
uses
Windows, M2Addon, M2AddonD, .....;
type
TPointEditor = class(TM2CustomEditor)
private
.....
public
......
procedure MouseMove(aShift: TM2ShiftState; aMouse: TPoint); override;
procedure MouseDown(aButton: TM2MouseButton; aShift: TM2ShiftState; aMouse: TPoint); override;
end;
var
gPointEditor: TPointEditor = nil;
implementation
......
procedure TPointEditor.MouseDown(aButton: TM2MouseButton; aShift: TM2ShiftState; aMouse: TPoint);
var
....
begin
if aButton = kmbLeft then
begin
aNewPt := FAddon.MapView.PointFromDevice(aMouse);
.....
end;
end;
......
end. |
примерно так для API. если нужно еще маусмув обрабатывать то пишешь обработчик в соответствующей процедуре. |
|
Вернуться к началу |
|
|
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Пн 21 Мар 2011 18:37 Заголовок сообщения: |
|
|
Спасибо. А не могли бы вы обрисовать инициализирующую часть? Дьявол, видимо, гнездится именно там... |
|
Вернуться к началу |
|
|
Foton
Зарегистрирован: 09.10.2006 Сообщения: 158 Откуда: Ярославль
|
Добавлено: Пн 21 Мар 2011 18:56 Заголовок сообщения: |
|
|
что именно? целиком же практически модуль запостил |
|
Вернуться к началу |
|
|
Алексей Васильев
Зарегистрирован: 20.05.2009 Сообщения: 105 Откуда: Самара
|
Добавлено: Вт 22 Мар 2011 11:44 Заголовок сообщения: |
|
|
Заработало! Действительно, дьявол был в инициализации.
Что тут больше повлияло, сказать затрудняюсь, но то, что в TPointEditor.GetEditorOptions нужно было заказывать не только eopMouseDown, но и eopProcessPhase - это совершенно точно. Без этого процедура не вызывалась. Кроме того, оказалось критично расположение и момент вызова процедуры подключения редактора. Я имею в виду Цитата: | if not Assigned(gPointEditor) then begin
gPointEditor := TPointEditor.Create(Self);
try MapView.AddEditor(gPointEditor.IEditor);
finally gPointEditor.IEditor._Release;
end;
end;
|
Возможно, это случайное совпадение, но заработало только после того, как я включил ее в класс TFirstAddon, а не TPointEditor, и вызов этой инициализации сделал заблаговременно, в момент FormActivate. а не непосредственно перед запросом координат.
Вам же Special Thanks за подсказку насчет PointFromDevice... |
|
Вернуться к началу |
|
|
|