Рисование линии на MapBasic через WinAPI

MapInfo, MapBasic
Ответить
Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Рисование линии на MapBasic через WinAPI

Сообщение dab » 01 мар 2012, 20:24

Нужна помощь в WinAPI
Необходимо реализовать линию - "резинку" от точки последнего клика мышкой до текущего положения курсора. Язык программирования MapBasic. С использованием функций WinAPI, функция практически готова. Осталось только реализовать удаление предыдущей линии перед началом рисования новой.
Код в приложении, его необходимо доработать.
Готов отблагодарить за помощь и морально и финансово :)
Вложения
ribber.zip
(1.25 КБ) 413 скачиваний

Аватара пользователя
asgs
Участник
Сообщения: 89
Зарегистрирован: 04 авг 2010, 06:35
Репутация: 1
Контактная информация:

Re: Рисование линии на MapBasic через WinAPI

Сообщение asgs » 02 мар 2012, 06:30

Интересная задачка ;)
Занялся бы, но смогу выложить результат только на следующей неделе (к теще в деревню вечером срываюсь), а к тому времени наверняка кто-нибудь сделает. Хотя возьму с собой исходник, поковыряюсь.
Путь решения, как я его вижу: копировать с контекста устройства прямоугольник в bitmap по щелчкам мыши перед тем, как рисовать линию; при последующем щелчке записывать по старым координатам. Должно работать довольно быстро.
Злобный йожег

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Re: Рисование линии на MapBasic через WinAPI

Сообщение dab » 02 мар 2012, 08:28

asgs писал(а):...Должно работать довольно быстро.
Да, скорость работы это важный параметр. :!:

thegeo
Активный участник
Сообщения: 161
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: Рисование линии на MapBasic через WinAPI

Сообщение thegeo » 02 мар 2012, 21:14

Не очень понятно зачем это нужно. Но все же предлагаю свой вариант. Код конечно сыроват и требует доработки (контроль ошибок и т.д.), но задачу решает.
Вложения
bb3.rar
(2 КБ) 373 скачивания

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Re: Рисование линии на MapBasic через WinAPI

Сообщение dab » 02 мар 2012, 21:36

thegeo писал(а):Не очень понятно зачем это нужно. Но все же предлагаю свой вариант. Код конечно сыроват и требует доработки (контроль ошибок и т.д.), но задачу решает.
Спасибо, но это не совсем то, что нужно.
Если я начал рисовать полилинию стандартным инструментом, кликнул первую точку и собираюсь кликнуть вторую - за курсором тянется "резинка", но следов от нею не остаётся.
В Вашем варианте "резинка" получается красно-белым пунктиром, а со следующим кликом она становится белой линией.
Вложения
no.jpg
no.jpg (14.28 КБ) 10781 просмотр
Последний раз редактировалось dab 03 мар 2012, 09:08, всего редактировалось 1 раз.

thegeo
Активный участник
Сообщения: 161
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: Рисование линии на MapBasic через WinAPI

Сообщение thegeo » 02 мар 2012, 22:14

mb00339.png
mb00339.png (2 КБ) 10773 просмотра
На рисунке результат работы после нескольких кликов мышью. Думаю, что дело здесь в том что я работаю в WinXP и MI8.0. Но как бы то ни было, подход остается тем же: чтобы "стереть" линию ее нужно , в режиме "исключающее ИЛИ", повторно нарисовать. В данном случае это выполняется дважды т.к. работаем с пунктиром.

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Re: Рисование линии на MapBasic через WinAPI

Сообщение dab » 03 мар 2012, 09:17

thegeo писал(а):Не очень понятно зачем это нужно.
Нужно для рисования полилинии собственным инструментом, с отображением процесса в нескольких окнах одновременно. Именно процесса, а не только результата.
Например, есть два окна карты с разными растрами. Часть точек рисуемой полилинии я хочу указать в одном окне, а часть точек в другом окне.
Стандарные инструменты Мапинфо с "резинкой" не позволяют выйти за пределы окна в процессе создания объекта.
А без линии-"резинки" кликать точки неудобно для восприятия, так как не совсем ясно как пройдёт сегмент полилинии.

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Re: Рисование линии на MapBasic через WinAPI

Сообщение dab » 06 мар 2012, 10:58

asgs писал(а):... а к тому времени наверняка кто-нибудь сделает...
Увы, нет.
По-прежнему актуально.

thegeo
Активный участник
Сообщения: 161
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: Рисование линии на MapBasic через WinAPI

Сообщение thegeo » 09 мар 2012, 12:42

Из прилагаемого кода и комментария ("Re: Рисование линии на MapBasic через WinAPI ...С использованием функций WinAPI, функция практически готова. Осталось только реализовать удаление предыдущей линии перед началом рисования новой.") сделал, очевидно, неправильный вывод, что требуется просто нарисовать отрезок, на некотором холсте, удаляя при этом предыдущий.
Реализация же "резиновой" нити в ее привычном понимании невозможна без обработки событий мыши. Схематически этот процесс может выглядеть следующим образом.

СТАРТ:
Создать
hDotPen = CreatePen(PS_DOT, 0, RGB(0,0,0))
hDC = GetDC(hWnd)

Событие BUTTONDOWN:
bTracking = TRUE
SetR0P2(hDC, R2_N0TX0RPEN)
Определить {x2,y2}
x1 = x2
y1 = y2
hOldPen = SelectObject(hDC, hDotPen)
Line(hDC, x1, y1, x2, y2)

Событие MOUSEMOVE:
if (bTracking)
{
// стереть предыдущую линию
Line(hDC, x1, y1, x2, y2)
// нарисовать новую линию
Определить {x2,y2}
Line(hDC, x1, y1, x2, y2)
}

Событие BUTTONUP:
if (bTracking)
{
bTracking = FALSE
SetR0P2(hDC, R2_C0PYPEN)
// окончательно нарисовать линию
Определить {x2,y2}
SelectObject(hDC, hOldPen)
Line(hDC, x1, y1, x2, y2)
}

Все это для одного отрезка, но несложно распространить и на полилинию. При этом надо учитывать, что все нарисованное в таком виде после первого обновления окна будет уничтожено. То есть возникает необходимость в сохранении окончательных координат и восстановлении отрезков (событие PAINT).
Для MI возникнет еще одна причуда, необходимость сохранения полученного, в виде объекта таблицы.
Возможно ли это все это в рамках MB, сомневаюсь. Для этого MB нужно трансформировать, по крайней мере, в VB.

thegeo
Активный участник
Сообщения: 161
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: Рисование линии на MapBasic через WinAPI

Сообщение thegeo » 13 мар 2012, 11:05

В последнем сообщении я был излишне категоричен. Реализовать обработку событий мыши в MB можно. Привожу пример возможной реализации.
Работа инструмента: клик мышью – первая точка, клик мышью – вторая точка, …, двойной клик мышью – последняя точка.
Среда: WinXP, MI 8.0.
Обращаю внимание: после обновления экрана нарисованная полилиния исчезнет.
Что можно сделать: так как используется ToolButton и DrawMode=DM_CUSTOM_POINT, то при каждом клике мышью можно получить реальные координаты (в координатной системе карты). Их можно накапливать и в дальнейшем нарисовать полилинию на редактируемом слое.
Вложения
ribb.rar
(2.99 КБ) 380 скачиваний

Аватара пользователя
dab
Гуру
Сообщения: 671
Зарегистрирован: 16 дек 2011, 20:02
Репутация: 170
Ваше звание: Гуру
Откуда: Москва
Контактная информация:

Re: Рисование линии на MapBasic через WinAPI

Сообщение dab » 13 мар 2012, 14:48

thegeo писал(а):В последнем сообщении я был излишне категоричен. Реализовать обработку событий мыши в MB можно. Привожу пример возможной реализации.
Работа инструмента: клик мышью – первая точка, клик мышью – вторая точка, …, двойной клик мышью – последняя точка.
Среда: WinXP, MI 8.0.
Обращаю внимание: после обновления экрана нарисованная полилиния исчезнет.
Что можно сделать: так как используется ToolButton и DrawMode=DM_CUSTOM_POINT, то при каждом клике мышью можно получить реальные координаты (в координатной системе карты). Их можно накапливать и в дальнейшем нарисовать полилинию на редактируемом слое.
Отлично, кажется то что мне надо! :D
"Кажется" - так как сейчас с ходу попробовал на 10.5 и MapInfo зависает в цикле Do ... Loop после второго клика.
Вечером посмотрю внимательнее код.
Спасибо! Напишите в личку - куда отправить "баунти"? :)

thegeo
Активный участник
Сообщения: 161
Зарегистрирован: 17 янв 2012, 18:51
Репутация: 74

Re: Рисование линии на MapBasic через WinAPI

Сообщение thegeo » 13 мар 2012, 16:37

Попробовал программу в MI 10.0 - без проблем.
Спасибо за предложение, но "баунти" не требуется.

Ответить

Вернуться в «MapInfo»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя