Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Графический редактор


Автор: _andrews_ 23.12.2006, 23:16
Есть обычный графический редактор, рисующий ЛИНИЮ, ЭЛЛИПС, КВАДРАТ, и КРИВУЮ.
При прорисовке, например линии, необходимо, чтобы она прорисовывалась "резиново", т.е. выбрали инструмент ЛИНИЯ, клацнули мышкой на поле рисования и потянули ей по окошку... Линия - хлоп! - и за мышкой потянулась, из стороны в сторону, из стороны в сторону, при этом зарисовывая те линии, которые нарисовались в процессе "скольжения" за мышкой. Сейчас же происходит такая ситуация, что ВСЕ эти линии остаются на рисунке..получается красивый веер, но он не в тему...хотя, повторюсь-получаются замысловатые такие фигурки.
Подскажите, как зарисовать все линии, и оставить только ту, которая останется при отпускании кнопки мышки?

Автор: Anikmar 24.12.2006, 00:15
При прорисовке линии использовать XOR
Нарисовали 1 раз
Потом с теми же координатами 2-й раз (линия стерлась, фон восстановился)
Передвинули координаты
Нарисовали 
и так далее
Когда пользователь подтверждает координуту - уже рисуем тем цветом, что надо

Автор: WERITAS 24.12.2006, 00:18
У тебя окно не очищается, отсюда и веер. Юзай Invalidate(hwnd,NULL,TRUE) где нужно. Но для "красивой" прорисовки линии этого мало. Когда потянешь за линию, она будет неприятно "мелькать" на экране. Чтобы этого не было надо сделать двойную буферизацию. В СиШарпе и Дельфи это делается одной строчкой smile а тут тебе надо будет создавать контекст устройства... вобщем порядочно работы : )

P.S. 
Цитата
... Линия - хлоп! -
 smile  Улыбнуло

Должно быть нечто вроде этого:
Код

// ф-ция №1 (можно WinMain)
{
.............................................
m_WindowHandle = CreateWindow(...);

ShowWindow(m_WindowHandle, SW_SHOW);
UpdateWindow(m_WindowHandle);

m_FrontBuffer = GetDC(m_WindowHandle);
SendMessage(m_WindowHandle, WM_PAINT, 0, 0);
............................................
}

.............................................

// ф-ция отрисовки линии
{
.............................................
RECT ClientRect;
GetClientRect(m_WindowHandle, &ClientRect);
Rectangle(m_FrontBuffer, 0, 0, ClientRect.right, ClientRect.bottom);
...................
// Отрисовка линии
...................
}

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)