На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты
АРХИВ ФОРУМА...
здесь вы можете ознакомиться с материалами форума до 08.06.2008

PanTask - вопросы чайника.

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти  
Форум » Настольные приложения » GIS ToolKit
Страницы: Пред. 1 2 3 След.
RSS
PanTask - вопросы чайника.
Олег Валентинович, Вы наверное неправилдьно поняли вопроса от Александра.
Как ловить нажатия на форме, знают надеюсь все.
Вопрос. Как отловить не имея ни одной созданой акции (TPanAction),
положение указателя мыши на карте в системе координат карты.
Одним словом:
Смоделировать бегунок ВОТ ЭТОТ :
Рисунок
на компоненте допустим TLabel (или в заголовке окна) у себя на немодальной форме.
Как это сделать?
Это уже вопрос от меня.
------------------------------------
Цитата
// Перемещение мышки по окну в текущей точке
long int _USERTASK utsMove(HPANACTION hact,long int modKeys,
POINT * point)
{
TPanAction * action = (TPanAction *) hact;
if ((action && point) != 0)
return action->Move(modKeys,*point);
return 0;
}


Предлагаемый Вами способ "отлова" движения мыши по окну карты, подразумевает
обязательное наличие объекта TPANACTION (или потомка).
Изменено: KFF (Фёдор) - 09.12.2010 18:13:42 (код к сообщению)
Mapview 11. ГИС Карта 10.7.7. GisToolKit 10 (и 11) Free.
ЧИСЛО СОБЩЕНИЙ = "Отмена крепостного права на РУСИ"
Я написал и об этом случае. Нужно создать в DLL задачу. И переопределить виртуальный метод Move в производном классе от класса задачи.

Для вывода координат точки в разных форматах в строку применяются следующие функции:

Код

// Установить формат отображения текущих координат курсора   // 09/06/10
// hmap    - идентификатор открытых данных
// format -  номер формата отображения координат (см. maptype.h - CURRENTPOINTFORMAT)
// При ошибке возвращает ноль, иначе - установленное значение

_MAPIMP long int _MAPAPI mapSetCurrentPointFormat(HMAP hmap, long int format);
  
// Запросить формат отображения текущих координат курсора
// hmap    - идентификатор открытых данных
// Возвращает номер формата отображения координат (см. maptype.h - CURRENTPOINTFORMAT)
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapGetCurrentPointFormat(HMAP hmap);
  
// Пересчитать значение координат из плоских прямоугольных координат документа (метры)
// в систему, определяемую форматом отображения текущих координат
// hmap    - идентификатор открытых данных
// x, y    - координаты точки в радианах в соответствии с текущими параметрами
//           проекции (mapGetDocProjection) - пересчитываются в новые значения
// h       - высота точки (указатель может быть равен нулю), если задано значение -
//           пересчитывается в новое значение
// maptype - тип карты, соответствующий координатам, если не равен нулю,
//           то добавляется строка с обозначением системы координат: "(СК42)", "(CR95)"...
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapPlaneToPointFormat(HMAP hmap,
double * x, double * y, double * h);
  
// Пересчитать значение координат из плоских прямоугольных координат документа (метры)
// в систему, определяемую форматом отображения текущих координат
// и сформировать строку
// hmap    - идентификатор открытых данных
// x, y    - координаты точки в радианах в соответствии с текущими параметрами
//           проекции (mapGetDocProjection)
// h       - высота точки (указатель может быть равен нулю)
// place   - адрес строки для записи результата
// size    - размер выделеной строки (не менее 256 байт)
// Пример строки:
// B= -73° 27' 04.53"  L= 175° 51' 21.07"  H= 109.51 m (WGS84)
// X= 6 309 212.12 м   Y= 7 412 249.25 м (СК42)
// При ошибке возвращает ноль

_MAPIMP long int _MAPAPI mapPlaneToPointFormatString(HMAP hmap, double * x, double * y, double * h,
char * place, long int size);
_MAPIMP long int _MAPAPI mapPlaneToPointFormatStringUn(HMAP hmap, double * x, double * y, double * h,
WCHAR * place, long int size);

// Вывод координат точки в строку
// x,y   - плоские прямоугольные координаты точки в метрах
// h     - высота в метрах или нулевой указатель
// place - адрес строки для размещения результата
// size  - размер строки (не менее 80 байт)
// maptype - тип карты, если не равен нулю, то добавляется строка
//           с обозначением системы координат: "   (СК42)", "   (CК95)",...
// Пример результата:
// "X=  438 145.27 m  Y= 6 230 513.03 m  H=  54.12 m"

_MAPIMP void _MAPAPI mapPlaneToString(double * x, double * y, double * h,
char * place, long int size, int maptype);



Господа, спасибо за ответы... Вдрызг простыл, три дня вообще к компу не подходил... Завтра таки начну разбираться в ваших советах! smile:)
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
Цитата
KFF (Фёдор) пишет:
Как ловить нажатия на форме, знают надеюсь все.
Не все... Чуть выше ж был разговор. MapAPI далось в принципе без проблем. А вот в PanAPI чего-то я никак не могу понять! smile:(
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
СКАЧАТЬ И СМОТРЕТЬ (МОЖЕТ ПОМОЖЕТ)
Не смотря на то что моё сообщение было удалено, советую посмотреть работу utsPrepareMessage
Изменено: KFF (Фёдор) - 14.12.2010 15:36:32
Mapview 11. ГИС Карта 10.7.7. GisToolKit 10 (и 11) Free.
ЧИСЛО СОБЩЕНИЙ = "Отмена крепостного права на РУСИ"
АП! Третий день осознаю себя полным идиотом! Ну никак до меня не доходит, что надо делать...
Вот реальная задача (TPanTask) - привязка информации к фрагментам границы (куски из протокола делимитации). Выбираю в Панораме объект, запускаю задачу, она вписывает имя файла протокола к фрагменту, формирует (если надо) начальную точку. Что-то типа погранзнака smile:) . И хотелось бы, как для погранзнаков, у части точек вписать и их номера. Т.е. указать точку на карте, а задача впишет:
Рисунок
Код
HMAPACTION TTask::GetAction(int comid, int run) {
  HMAPACTION action;
  if ((action = TPanTask::GetAction(comid, run)) != 0)
    return action;
  SeekCommand(comid, run) {
    CheckCommand(TASK_OPEN, Open, 0);
    CheckCommand(TASK_QUIT, Quit, 0);
  }
  SeekAction(comid, run) {
    CheckAction(MOUSE_LDN, TMyAction, 0);  // сюда не попадаю
  }
  ReturnAction();
}
//===========================================================================
//===========================================================================
TMyAction::TMyAction(TTask *task, int ident) :
                 TPanAction(task, ident){
}
//===========================================================================
TMyAction::~TMyAction() {
}
//===========================================================================
int TMyAction::LeftDown(UINT mode, TPoint &point) {
  int u = 0;  // не попадаю я сюда!!!
}

Кто и где должен создавать экземпляр TMyAction? Примеры в SDK смотрел, ответа не нашёл!
---
Как я понимаю, при клике мышкой Панорама запускает свой собственный обработчик для поиска объектов в точке?
Изменено: Газонокосильщик - 04.02.2012 16:54:02
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
Чтобы создать обработчик напишите класс производный TPanAction, затем вставьте имя этого класса в функцию GetAchion в макросе SeekAction примерно так:

SeekAction(comid,run)
{
// Параметры для CheckAction: Идентификатор команды, Обработчик, Раздел Help
CheckAction(ID_MYCOMMAND, CMyAction, 0);
}

ID_MYCOMMAND - идентификатор кнопки панели, запускающей Ваш обработчик, CMyAction - собственно имя класса.


Если вашей задаче не нужна панель с кнопками, то можно сразу же создать обработчик "напролом", для чего просто переопределим метод CreateTaskPanel, например так:

MyTask::CreateTaskPanel(int)
{
CMyAction* act;
act = new myAction(this,1);
// Передадим задаче указатель на созданный обработчик
Action= (TPanAction*) act;

myAction.Setup();
return 0;
}

Проверено - и так работает. CreateTaskPanel вызывается сразу же после создания экземпляра задачи, только в этом случае вместо панели он создаст обработчик. Только не забудьте в этом случае методе Quit обработчика прописать вызов ActionTask->Quit(), а то потом не сможете завершить задачу.
Для второго случая, наверное, есть более элегантное решение, но документация об этом умалчивает smile;) .
Изменено: Олег Касьянов - 05.02.2012 22:13:33
Цитата
Олег Касьянов пишет:
Если вашей задаче не нужна панель с кнопками
На картинке - красно-синяя точка, созданная после нажатия кнопки Выполнить. Тут всё ОК!
А теперь мне нужно указать на карте точку для создания подписи и принять эти координаты в мою задачу.
Нашёл вот такое:
Цитата
TPanAction.LeftDown
Извещение обработчика о факте нажатия левой кнопки мыши
Связь:
Вызывается экcпортной функцией utsLeftDown
Синтаксис:
function LeftDown(modKeys: UINT; var POINT : TPOINT): integer; virtaul;
Где: ModKeys - флаги нажатых служебных клавиш Ctrl, Shift, Alt (Ctrl=2 и.т.п см. Windows.pas)
point - точка в экранной системе координат, в которой была нажата кнопка.
Результат - если нажатие клавиши (сочетание клавиш) обработано =1 если нет =0.

ВНИМАНИЕ! Метод не активен ! Для активации установите в методе CanSelectObject нулевой результат !!!

Но - этот метод возвращает результат. Это геттер, а не сеттер. Сеттер на запрет выбора объекта в Панораме я не нашёл.
В общем, пока на том же месте торчу. smile:(
И вопросы к Олегу Касьянову появились:
Код
MyTask::CreateTaskPanel(int) {
  CMyAction* act; // что за объект - понятно, непонятно почему он локальный
  act = new myAction(this,1); // тут просто опечатка в имени конструктора?
  // Передадим задаче указатель на созданный обработчик
  Action= (TPanAction*) act;  // тут вопросо нет
  myAction.Setup();  // это что такое?
  return 0;
}
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
Нормальные герои всегда идут в обход! ©
Пока выкрутился через запуск таймера и task->MapWindow->GetCursorPos(p); Застрял на пересчёте координат.
Коллеги, в аттаче болванка задачи на БСБ-6. Буду весьма признателен, если кто-то из вас не пожалеет времени и не допишет в неё код, выводящий в заголовок формочки координаты точки после клика мышкой по карте. smile:)
http://ifolder.ru/28540992
Цитата
Газонокосильщик пишет:
Сеттер на запрет выбора объекта в Панораме я не нашёл.
Разобрался... Не так понял вначале.
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
Разобрался окончательно. Сейчас кой-чего подправлю и приаттачу пример. smile:)
ЗЫ - и никаких таймеров!
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)


© КБ Панорама, 1991-2012