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

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

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти  
Форум » Настольные приложения » GIS ToolKit
Страницы: 1 2 3 След.
RSS
PanTask - вопросы чайника.
Здравствуйте!
Вот тут я - действительно полный чайник, прошу сильно не пинать.
Нашёл тут очень полезный труд http://www.gistoolkit.com/forum/messa...essage3716. Даже сконстролил на коленке задачу, которая вызывается в Панораме без последствий как для Панорамы, так и для системы. Но сразу же вопросы:
1 - ::PostMessage(MapWindow->GetMainHandle(), WM_COMMAND, CM_OPEN, 0); - не нашёл такой константы, нашёл в дебрях SDK ACM_OPEN. Так и должно быть?
2 - DestroyAction(Action->Ident()); - Ошибка - Ident не член класса TPanAction. Пока этот вызов закомментировал, но он же неспроста указан.
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
Вопрос снят... Всем спасибо!
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
А вот теперь вопрос от действительно чайника. Есть метод GetAction(), переписанный с вышеуказаного треда
Код
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);
  }
  ReturnAction();
}
Как в него добавить, к примеру, обработчик нажатия левой кнопки мышки в окне карты? Что для этого надо сделать? Где найти сами идентификаторы сообщений? Копался в mapview.rh - там их много, а описания практически никакого. Пытался тупо отловить WM_LBUTTONDOWN - оно просто не приходит...
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
Цитата
WM_LBUTTONDOWN - оно просто не приходит

smile:D я тоже когда то пытался.
Акция это такая интересная штука, что в ней сложно всё отловить.
Система такова:
Имеется панель с кнопками, на клик кнопки (допустим 2-й) должна вызыватся акция
Для этого:
Вы должны создать на обработчике клика объект АКЦИЮ (или потомок от TPanAction)
И Вернуть его внутренний хендл (самой акции) назад в ГИС Карту.
После того, как в Гис Карту ушёл хендл акции, все движения оператора
будут проходить через методы объекта акции.
Отловить их можно именно там.
Mapview 11. ГИС Карта 10.7.7. GisToolKit 10 (и 11) Free.
ЧИСЛО СОБЩЕНИЙ = "Отмена крепостного права на РУСИ"
Код

//----------------------------------------------------------------
// Подключение обработчика
//----------------------------------------------------------------
HMAPACTION TPanelRoad::GetAction(int comid, int run)
{
  // Запросить базовый список команд
  HMAPACTION action;
  if ((action = TPanTask::GetAction(comid,run)) != 0) return action;

  SeekCommand(comid,run)
  {
    // Вызов диалогов
    CheckCommand(...);
  }

  // Выполнение команд с помощью обработчика (кнопки - обработчики)
  SeekAction(comid,run)
  {
    // Вызов обработчика
    CheckAction(ID_MYTASK, TMyAction, ID_MYHELP);  // Ваш идентификтор ID_MYTASK должен быть уникальным (типа IDT_FREEAPPL + X) - свободного диапазона для внешних разработчиков не нашел (попробуйте начать с 0x7F00). Вероятно необходимо добавить такой диапазон.
  }

  ReturnAction();
}

//=====================================================
//  Конструктор обработчика
//=====================================================
TMyAction::TMyAction(TPanelRoad * task, int ident)
                 :TPanAction((TPanTask*)task, ident)
{
}
В классе TPanAction есть функции реакций нажатия:
Код

// Управление "мышью"
// Нажата левая кнопка в текущей точке
virtual int LeftDown(UINT /*modKeys*/, POINT& /*point*/)
{ return 0; }
// Отпущена левая кнопка в текущей точке
virtual int LeftUp(UINT /*modKeys*/, POINT& /*point*/)
{ return 0; }
// Перемещение мышки по окну в текущей точке
// modkeys - соответствует значению WPARAM в сообщении WM_MOUSEMOVE
virtual int Move(UINT /*modKeys*/, POINT& /*point*/)
{ return 0; }

// Нажата правая кнопка в текущей точке
// Если возвращает ненулевое значение -
// всплывающее меню блокируется (не всплывает !)
// Может применятся, когда правая кнопка нажимается
// вместе с клавишами ALT,CNTRL и т.п.
virtual int RightDown(UINT /*modKeys*/, POINT& /*point*/)
{ return 0; }

// Нажата правая кнопка в текущей точке
virtual int RightUp(UINT /*modKeys*/, POINT& /*point*/)
{ return 0; }
Спасибо, есть хотя бы куда думать! smile:)
Цитата
KFF (Фёдор) пишет:
Имеется панель с кнопками, на клик кнопки (допустим 2-й) должна вызыватся акция
У меня не панель с кнопками, у меня немодальное окно! Или это не принципиально?
Цитата
Alexander Kruzhkov пишет:
// Вызов обработчика CheckAction(ID_MYTASK, TMyAction, ID_MYHELP);// Ваш идентификтор ID_MYTASK должен быть уникальным (типа IDT_FREEAPPL + X) - свободного диапазона для внешних разработчиков не нашел (попробуйте начать с 0x7F00). Вероятно необходимо добавить такой диапазон.
А диапазон начиная с IDT_USERTASK пользовать нельзя? Я вот такое с ним уже запустил
Код
#include <vcl.h>
//#include <windows.h>
#pragma hdrstop
#include "Task.h"
#include "mapview.rh"
#include "DllForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//===========================================================================
#define TASK_OPEN IDT_USERTASK + 100      // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define TASK_QUIT IDT_USERTASK + 101      // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//===========================================================================
TTask::TTask(HMAPDOC hMapDoc, TASKPARM *parm, const char *dllName):
             TPanTask(hMapDoc, parm, dllName) {
  Action = 0;
  FParm = parm;
  ::PostMessage(MapWindow->GetMainHandle(), WM_COMMAND, TASK_OPEN, 0);
}
//===========================================================================
TTask::~TTask() {
  if (Action) {
    DestroyAction(Action->Ident());
    Action = 0;
  }
  delete FDllForm;
  FDllForm = NULL;
}
//===========================================================================
void TTask::Open() {
  if (!FDllForm) {
    FDllForm = new TFDllForm(Application, this);
    FDllForm->Show();
  }
  else {
    ::MessageBeep(0);
    FDllForm->BringToFront();
} }
//===========================================================================
void TTask::Close() {
  ::PostMessage(MapWindow->GetMainHandle(), WM_COMMAND, TASK_QUIT, 0);
}
//===========================================================================
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);
  }
  ReturnAction();
}
//===========================================================================
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
В версии 11 диапазон для кнопок на панели прикладной задачи может быть в принципе любой (1,2,3...).
Панели обрабатываются ГИС штатно и команды при нажатии\отжатии кнопок штатно обрабатываются и для них вызываются методы задачи.
Если Вы сами управляете диалогом с кнопками, то при нажатии кнопок нужно послать активному окну карты
SendMessage(HWND_окна_карты, MT_TASKCOMMAND, id_команды (1,2,3...), HINSTANCE_вашей_DLL);

#define MT_TASKCOMMAND 0x63A
Господа! Мне не нужны кнопки на панелях. Мне надо в моём немодальном окне поймать нажатие мышки - для начала получить координаты этой точки. Это реально?
Ну не хук же писать!
Non sunt entia multiplicanda praeter necessitatem. © William of Occam
Если окно ваше, то ГИС оболочка его не контролирует, и работа с мышкой лежит на вас. То что от мышки ничего не приходит - странно. Например прикладная задача - База данных написана на Delphi и у нее в основном все окна немодальные и нажатие мыши отрабатывает.
Если нажатия мышкой выполняются в вашем диалоге, то все стандартные сообщения направляются вашему окну. Обработка сообщений зависит от применяемых компонент.
Например, в VCL - FormKeyDown(TObject *, WORD&, TShiftState ).
Если нужно ловить нажатие мышкой на карте, то нужно активизировать обработчик некоторого действия с картой. Для перехвата перемещения мышки над картой в задаче есть событие

Код
  
  // Перемещение мышки по окну в текущей точке           // 24/01/06
  virtual int Move(UINT /*modKeys*/, POINT& /*point*/)
{ return 0; }

Страницы: 1 2 3 След.
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)


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