Страница 1 из 1

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

Добавлено: 01 мар 2012, 20:24
dab
Нужна помощь в WinAPI
Необходимо реализовать линию - "резинку" от точки последнего клика мышкой до текущего положения курсора. Язык программирования MapBasic. С использованием функций WinAPI, функция практически готова. Осталось только реализовать удаление предыдущей линии перед началом рисования новой.
Код в приложении, его необходимо доработать.
Готов отблагодарить за помощь и морально и финансово :)

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

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

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

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

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

Добавлено: 02 мар 2012, 21:14
thegeo
Не очень понятно зачем это нужно. Но все же предлагаю свой вариант. Код конечно сыроват и требует доработки (контроль ошибок и т.д.), но задачу решает.

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

Добавлено: 02 мар 2012, 21:36
dab
thegeo писал(а):Не очень понятно зачем это нужно. Но все же предлагаю свой вариант. Код конечно сыроват и требует доработки (контроль ошибок и т.д.), но задачу решает.
Спасибо, но это не совсем то, что нужно.
Если я начал рисовать полилинию стандартным инструментом, кликнул первую точку и собираюсь кликнуть вторую - за курсором тянется "резинка", но следов от нею не остаётся.
В Вашем варианте "резинка" получается красно-белым пунктиром, а со следующим кликом она становится белой линией.

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

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

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

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

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

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

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

Добавлено: 09 мар 2012, 12:42
thegeo
Из прилагаемого кода и комментария ("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.

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

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

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

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

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

Добавлено: 13 мар 2012, 16:37
thegeo
Попробовал программу в MI 10.0 - без проблем.
Спасибо за предложение, но "баунти" не требуется.