Сообщение
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.