Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рисование линии 
:(
    Опции темы
Toohtik
Дата 19.11.2006, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



Здраствуйте. Есть такая задача: Нажатие левой кнопки мыши определяет первую точку линии. Не отпуская кнопки пользователь перемещает мышь во вторую точку отрезка. Отпускание кнопки приводит к фиксации второй точки линии. Во время движения с нажатой кнопкой мыши, линия должна перерисовываться.
С мышкой разобрался, а вот с нормальным выводом линии никак не могу понять. Т.е. Линии рисуются, но их много, а должна быть одна, как в Paint. Подскажите пожалуйста.
PM ICQ   Вверх
Aleksandor
Дата 19.11.2006, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



Мона рисовать в ответ на MOUSE_MOVE функцией PatBlt c флагом PATINVERT, старая линия стирается по старым координатам, обновляем координаты, новая рисуется уже по новым координатам


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
neosapient
Дата 19.11.2006, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Попробовал сделать прогу, но не получилось - похоже таже проблема, что и у тебя.
Может "старшие" на портале подправят пример.

Значит в кратце, попробовал сделать двойной буфер:
задний слой - DraftCopy - конечные состояния рисунков
передний слой - CleanCopy - в нем редактируются и накладываются рисунки

По приходу MOUSE_MOVE из сохраненого рисунка DraftCopy копирую в CleanCopy.
И в CleanCopy наношу линию.

По приходу WM_LBUTTONUP сохраняю текущее состояние со всеми изменениями в DraftCopy.

По приходу WM_PAINT из CleanCopy (со всеми изменениями) вывожу на экран.


Это сообщение отредактировал(а) neosapient - 19.11.2006, 15:00

Присоединённый файл ( Кол-во скачиваний: 18 )
Присоединённый файл  DrawLineInWindow.rar 53,68 Kb
PM MAIL   Вверх
Earnest
Дата 20.11.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Для каждой конечной точки линия рисуется дважды, при этом нужно контексту поставить операцию, скажем R2_NOT (SetRop2).
Примерно так: на MouseMove
   получаем контекст
   ставим операцию R2_NOT,
   рисуем линию от первой точки до старой позиции
   снова рисуем от первой точки до новой позиции
   восстанавливаем состояние контекста

Можно использовать не только NOT, но и скажем, XOR. В первом случае от увета пера вообще ничего не зависит, во втором - с помощью цвета пера можно управлять цветом выводимой линии.






--------------------
...
PM   Вверх
neosapient
Дата 20.11.2006, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Занимательный пример.  smile 
Собрал проект, сейчас буду разбираться с его кодом.



Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  SetROP2.rar 55,75 Kb
PM MAIL   Вверх
neosapient
Дата 20.11.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Нашел  ошибоку:
использовал флаг копирования SRCAND, а надо SRCCOPY
Пример прикрепил (см. ниже).
Теперь рисует линии как надо.

------------------

Попутно пока ветка не закрыта
Earnest писал
Цитата

при этом нужно контексту поставить операцию, скажем R2_NOT (SetRop2).

Я в этой функции не разобрался, можно на пальцах для чего она.
И в предыдущем своем посте я прикрепил пример из MSDN (архив SetROP2.rar). Тоже проблематично читается. Если есть время объясни для чего в примере все эти манипуляции с rectangle`ами.

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  DrawLineInWindow2.rar 53,55 Kb
PM MAIL   Вверх
Toohtik
Дата 20.11.2006, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



Сегодня была лаба, вообщем решение такое:
Код

        case WM_LBUTTONDOWN:
            
                x=LOWORD(lParam);
                y=HIWORD(lParam);
                pt[a].x=x;
                pt[a].y=y;
                ++a;
                i=1;
            break;
        
        case WM_MOUSEMOVE:
                x1=LOWORD(lParam);
                y1=HIWORD(lParam);
                pt[a].x=x1;
                pt[a].y=y1;
                InvalidateRect(hWnd,NULL,1);
                break;
        case WM_LBUTTONUP:

                x2=LOWORD(lParam);
                y2=HIWORD(lParam);
                pt[a].x=x2;
                pt[a].y=y2;
                a++;
                break;
        
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: Add any drawing code here...
            RECT rt;
            for(i=0;i<a;i+=2)
            {
                MoveToEx(hdc,pt[i].x,pt[i].y,NULL);
                LineTo(hdc,pt[i+1].x,pt[i+1].y);
            }
            GetClientRect(hWnd, &rt);
            EndPaint(hWnd, &ps);
            break;



PS как прикрепит файл я не нашел, а может еще "не дорос":)
PM ICQ   Вверх
neosapient
Дата 20.11.2006, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 16.8.2006

Репутация: 3
Всего: 4



Цитата

PS как прикрепит файл я не нашел, а может еще "не дорос":) 

Посмотри под списком ответов "фиговый листочек" с надписью "ответить"
Ну соответственно нажимаешь на него и откроется форма ответов .
Внизу формы прикрепляешь файл.
Ограничение на файл 120 Кб (поэтому убери все лишнее, но ехе-шник постарайся оставить).

Э прикрепи весь архив проекта.

А то лень дособирать из кусочка

Это сообщение отредактировал(а) neosapient - 20.11.2006, 23:52
PM MAIL   Вверх
Toohtik
Дата 20.11.2006, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 142
Регистрация: 30.1.2006
Где: Харьков

Репутация: нет
Всего: нет



Спасибоsmile


Присоединённый файл ( Кол-во скачиваний: 27 )
Присоединённый файл  Vlad.cpp 5,33 Kb
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0524 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.