//lpPen, lpDC, bCorrect /*BOOL*/ - глобальные переменные
lpPen = new CPen(PS_SOLID, 1, RGB(0, 200, 0));
lpDC->SelectObject(lpPen);
lpDC->MoveTo(point.x, point.y);
bCorrect = FALSE;
Рисовать всегда прямые линии на DC?
на OnLButtonDown
Код:
на OnMouseMove
Код:
if (!bCorrrect)
lpDC->LineTo(point.x, point.y);
lpDC->LineTo(point.x, point.y);
Вот так рисуется как карандашем (как вожу - такая кривая и рисуется).
Нужно, чтобы рисовалась всегда прямая, т.е. наикратчайшее расстояние от начальной точки (где произошло событие OnLButtonDown) до конечной - постоянно меняется точка на маузмув. (ну т.е. нажал на кнопку, водишь мышкой, а у тебя прямая постоянно изменяется)...
Вопрос поставлю другой. Как удалить последнюю нарисованную прямую? Используя CClientDC и СPen
Цитата:
на OnMouseMove
Код:
if (!bCorrrect)
lpDC->LineTo(point.x, point.y);
Вот так рисуется как карандашем (как вожу - такая кривая и рисуется).
Нужно, чтобы рисовалась всегда прямая, т.е. наикратчайшее расстояние от начальной точки (где произошло событие OnLButtonDown) до конечной - постоянно меняется точка на маузмув. (ну т.е. нажал на кнопку, водишь мышкой, а у тебя прямая постоянно изменяется)...
Нужно делать две вещи:
1. Восстановить рисунок под уже нарисованной линии;
2. Вернуть точку в начало
Код:
if (!bCorrrect)
{
lpDC->MoveTo(Start.x, Start.y);
lpDC->LineTo(point.x, point.y);
}
{
lpDC->MoveTo(Start.x, Start.y);
lpDC->LineTo(point.x, point.y);
}
Там где-то можно поставить для Pen режим XOR_PUT - тогда рисуюя линию по тому же месту второй раз изображение будет стираться.
Нажал на левую кнопку мыши и ведешь линию... Крутишь вправо/влево а у тебя на контексте всегда одна линия. Ну как в пейнте: выбрал линию и вертишь ее как хочешь... До тех пор пока не отпустишь кнопку. Как отпустил, только в тот момент она как бы нарисовалась.
затем ты создаеш такой же 2ой буфер и при прорисовке линии сначала копируеш содержимое бэк буфера в 2ой буфер а поверх него прорисовываеш линию в заданном положении и уже этот буфер выводиш на экран. При перересовке экрана все повторяется только у же с новыми координатами для твоей линии. и в конце когда тебе надо зафиксировать линии в бэк буфере то рисуеш ее прямо в бэк буфер. Надеюсь понятно.
На нажатие кнопки мыши: ставим XOR_PUT и запоминаем sx,sy
На движение что-то типа:
MoveTo(sx,sy); LineTo(oldx,oldy);
oldx=cx, oldy=cy;
MoveTo(sx,sy); LineTo(cx,cy);
Да. Я так же это увидел! Но, после того как ты отрисовал линию, она остается на контексте ((( А следующая просто дорисовывается, и в результате получаем много линий. У меня и стоит проблема, как удалить предыдущую линию?
Запоминаем позиции,рисуем линию.
Чтобы затереть предыдущую линию, посмотри параметры функции CreatePen - стиль и цвет. Перед обработкой событий чтобы часто не создавать/удалять карандаши проще в начале создать два карандаша - один будет выводить линию, другой - затирать, а затем в конце их удалить.
Только не забудь каждый раз при рисовании выбирать нужный карандаш в контекст устройства.
Даже режим рисования"XOR_PUT" не помогает? Весьма странно...
Такого режима при рисовании нет. Это режим функицй *Blt
Кстати при затирании предыдущей линии... Нужно попробовать... Хотя вот сейчас пытаюсь найти более простой способ =)
Цитата:
lpPen = new CPen(PS_SOLID, 1, RGB(0, 200, 0));
А что за параметр 1? Если вместо него примерно 14 поставить (если это режим рисования)
Параметр 1 - это толщина линии в пикселях. У меня толщина линии следовательно 1 пиксель )
У CPen нет разве свойства Mode?