Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Рисовать всегда прямые линии на DC?

249
15 октября 2006 года
DissDoc
639 / / 01.10.2004
Проблема вот в чем. Вот что я делаю
на OnLButtonDown
 
Код:
//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;


на OnMouseMove
 
Код:
if (!bCorrrect)
lpDC->LineTo(point.x, point.y);

Вот так рисуется как карандашем (как вожу - такая кривая и рисуется).
Нужно, чтобы рисовалась всегда прямая, т.е. наикратчайшее расстояние от начальной точки (где произошло событие OnLButtonDown) до конечной - постоянно меняется точка на маузмув. (ну т.е. нажал на кнопку, водишь мышкой, а у тебя прямая постоянно изменяется)...
249
15 октября 2006 года
DissDoc
639 / / 01.10.2004
Вопрос поставлю другой. Как удалить последнюю нарисованную прямую? Используя CClientDC и СPen
309
16 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата:

на 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);
}
547
16 октября 2006 года
Hydra
488 / / 20.06.2006
Там где-то можно поставить для Pen режим XOR_PUT - тогда рисуюя линию по тому же месту второй раз изображение будет стираться.
249
16 октября 2006 года
DissDoc
639 / / 01.10.2004
Это я тоже сделал уже. А мне надо... как бы сказать правильно.. сделать такой эффект, чтобы
Нажал на левую кнопку мыши и ведешь линию... Крутишь вправо/влево а у тебя на контексте всегда одна линия. Ну как в пейнте: выбрал линию и вертишь ее как хочешь... До тех пор пока не отпустишь кнопку. Как отпустил, только в тот момент она как бы нарисовалась.
406
16 октября 2006 года
vitaly2003s
481 / / 27.07.2004
Используй для вывода изображения один буфер(контекст) а для неизмененых данных другой контекст(бэк буффер). То есть вначале у тебя есть 1 буфер - бэк буфер куда ты копируеш всю картинку
затем ты создаеш такой же 2ой буфер и при прорисовке линии сначала копируеш содержимое бэк буфера в 2ой буфер а поверх него прорисовываеш линию в заданном положении и уже этот буфер выводиш на экран. При перересовке экрана все повторяется только у же с новыми координатами для твоей линии. и в конце когда тебе надо зафиксировать линии в бэк буфере то рисуеш ее прямо в бэк буфер. Надеюсь понятно.
547
17 октября 2006 года
Hydra
488 / / 20.06.2006
Как я это вижу:
На нажатие кнопки мыши: ставим XOR_PUT и запоминаем sx,sy
На движение что-то типа:
MoveTo(sx,sy); LineTo(oldx,oldy);
oldx=cx, oldy=cy;
MoveTo(sx,sy); LineTo(cx,cy);
249
19 октября 2006 года
DissDoc
639 / / 01.10.2004
Да. Я так же это увидел! Но, после того как ты отрисовал линию, она остается на контексте ((( А следующая просто дорисовывается, и в результате получаем много линий. У меня и стоит проблема, как удалить предыдущую линию?
284
19 октября 2006 года
michael_is_98
587 / / 25.02.2005
Ничего сложного нет. Отлавливам события WM_MOUSEMOVE, WM_LBUTTONUP,WM_LBUTTONDOWN.
Запоминаем позиции,рисуем линию.
Чтобы затереть предыдущую линию, посмотри параметры функции CreatePen - стиль и цвет. Перед обработкой событий чтобы часто не создавать/удалять карандаши проще в начале создать два карандаша - один будет выводить линию, другой - затирать, а затем в конце их удалить.
Только не забудь каждый раз при рисовании выбирать нужный карандаш в контекст устройства.
547
20 октября 2006 года
Hydra
488 / / 20.06.2006
Даже режим рисования"XOR_PUT" не помогает? Весьма странно...
284
20 октября 2006 года
michael_is_98
587 / / 25.02.2005
Такого режима при рисовании нет. Это режим функицй *Blt
249
20 октября 2006 года
DissDoc
639 / / 01.10.2004
Кстати при затирании предыдущей линии... Нужно попробовать... Хотя вот сейчас пытаюсь найти более простой способ =)
547
23 октября 2006 года
Hydra
488 / / 20.06.2006
Цитата:

lpPen = new CPen(PS_SOLID, 1, RGB(0, 200, 0));


А что за параметр 1? Если вместо него примерно 14 поставить (если это режим рисования)

249
23 октября 2006 года
DissDoc
639 / / 01.10.2004
Параметр 1 - это толщина линии в пикселях. У меня толщина линии следовательно 1 пиксель )
547
24 октября 2006 года
Hydra
488 / / 20.06.2006
У CPen нет разве свойства Mode?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог