Здравствуйте! Скажите, пожалуйста, поддерживают ли компоненты TMapScreen и TMapView мультитачевые жесты. Если нет, то может быть подскажете, как лучше реализовать igiZoom и igiRotate. В разработке используем Rad Studio XE3 Gis ToolKit 11.9.0.
Администратор
Сообщений: Регистрация: 10.06.2008
17.06.2013 14:00:42
Нет. Компоненты TMapScreen и TMapView не поддерживают напрямую такие действия пользователя как мультитачевый зум или поворт экрана. Возможно, в перспективе добавим. Пока это можно сделать самостоятельно, используя свойство ViewScale (управление масштабом отображения) и метод TurnSetup (установка угла поворота карты).
Пример того, как отследить эти события: (см. handleRotate и handleZoom)
Для масштабирования алгоритм такой: 1. выключить Rendering в компоненте; 2. рассчитать коэффициент изменения масштаба (по TGestureEventInfo.Distance); 3. запомнить центр карты (GetCenter); 4. изменить масштаб на рассчитанное значение (ViewScale); 5. восстановить центр карты (SetCenter); 6. включить Rendering и сделать перерисовку карты. (пункты 3-4-5 можно заменить на масшабирование с помощью ScaleInPoint)
Для поворота алгоритм такой: 1. выключить Rendering в компоненте; 2. запомнить центр карты (GetCenter); 3. повернуть карту методом TurnSetup в соответсвии со значением TGestureEventInfo.Angle, с учетом текущего поворота карты (свойство TurnAngle); 5. восстановить центр карты (SetCenter); 6. включить Rendering и сделать перерисовку карты.
GetCenter и SetCenter в обоих слуаях обязательно делать не в пискелах, а в метрах (или в радианах, если карта поддерживает геодезическую СК).
PS Пока до Вас никто всерьёз этим не озадачивался. Поэтому живыми примерами порадовать не можем. Если Вы достигните положительного результата в этом вопросе, просьба тут выложить примерчик. Так сказать, в назидание потомкам...
Пользователь
Сообщений: Регистрация: 20.12.2012
17.06.2013 14:03:57
Спасибо! Буду пробовать, если что получится - выложу.
Пользователь
Сообщений: Регистрация: 20.12.2012
18.06.2013 14:48:54
Вот сделал небольшой примерчик. .
В связи с этим возник вопрос. На планшете довольно тормозной процессор и во время масштабирования и поворота видно как карта перерисовывается по кускам. И чем больший кусок карты попадает на экран, тем медленнее все отображается. Скажите, пожалуйста, может можно каким либо образом на время этой обработки отключать часть слоев на карте? Уменьшить, так сказать детализацию карты.
Администратор
Сообщений: Регистрация: 05.06.2008
18.06.2013 17:16:17
При работе ГИС Карта 2011 на планшетах с Windows 8 управление пальцами поддерживается без дополнительного программирования за счет того, что операции пальцами автоматически отправляют сообщения, как от колесика мышки. Операции масштабирования и листания карты выполняются в полном объеме.
Пользователь
Сообщений: Регистрация: 20.12.2012
18.06.2013 18:51:35
Цитата
Oleg Belenkov пишет: При работе ГИС Карта 2011 на планшетах с Windows 8 управление пальцами поддерживается без дополнительного программирования за счет того, что операции пальцами автоматически отправляют сообщения, как от колесика мышки.
Операции масштабирования и листания карты выполняются в полном объеме.
Только что сделал самую простую программку с одним TMapScreen на форме и проверил ее на планшете. Поддерживается только перемещение с помощью пальцев, масштабирование не работает. Планшет Samsung 500T c полноценной Win 8.
Администратор
Сообщений: Регистрация: 05.06.2008
18.06.2013 20:51:47
Значит нужно добавить еще некоторые комбинации работы с колесом мышки. Как вариант (из ГИС Карта 2011):
Код
#define WHEEL_DELTA 120
// Включение опции масштабирования колесом мышки
int WheelScale = 0;
//---------------------------------------------------------------------------
// Крутится колесико мышки
//---------------------------------------------------------------------------
void __fastcall TMDIChild::FormMouseWheel(TObject *Sender,
TShiftState Shift, int WheelDelta, TPoint &MousePos, bool &Handled)
{
int delta = max(48, abs(WheelDelta * 32/WHEEL_DELTA));
if ((WheelScale == 0) &&11/04/07
((::GetKeyState(VK_CONTROL) & 0xFFF8000) == 0)) // 24/06/06
{
// Перемещение карты
if (WheelDelta < 0)
{
if (Shift.Contains(ssShift))
HorzScrollBar->Position += (delta * 2);
else
VertScrollBar->Position += delta;
}
else
{
if (Shift.Contains(ssShift))
HorzScrollBar->Position -= (delta * 2);
else
VertScrollBar->Position -= delta;
}
// Уведомить об изменении позиции мышки // 30/07/10
POINT pos;
GetCursorPos(&pos);
MapWindowLink.OnMove(ShiftStateToKeys(Shift), pos);
}
else
{
// Масштабирование
if (WheelDelta > 0) // 25/07/06
{
// Посылка символов > и < для пошагового масштабирования (но можно и плавно масштабировать...)
MapWindowLink.OnKeyDown(190, 0, 0);
}
else
{
MapWindowLink.OnKeyDown(188, 0, 0);
}
}
Handled = true;
}
Пользователь
Сообщений: Регистрация: 20.12.2012
19.06.2013 15:26:20
Что-то в вашем примере я никак не разберусь.
Что такое MapWindowLink, куда мы посылаем эти символы? И еще, я правильно понял, что если я сделаю зуммирование на событие Ctrl+MouseWheel, тогда это будет на планшете работать как жест для зума?
Администратор
Сообщений: Регистрация: 09.06.2008
19.06.2013 18:54:08
На MapWindowLink не обращайте внимания (это куски текста из другой программы). Имелось ввиду, что Windows8 превращает движение двумя пальцами в комбинацию MouseWheel + CTRL
Пользователь
Сообщений: Регистрация: 25.12.2023
31.03.2025 18:21:40
Добрый день в 15 версии появилась ли поддержка мультижестов ?