Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
 Аватар для Pro100Tom
154 / 31 / 11
Регистрация: 29.10.2012
Сообщений: 397

Не получается рисовать больше чем одну линию в win32

07.11.2012, 22:52. Показов 2519. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте снова,
Цель такова: надо сделать программу типа Paint. Одна из возможностей - рисовать прямую линию. Начало там, где щелкают мышкой, пока кнопка зажата, можно двигать курсор куда угодно, а при отпускании линия фиксируется. Проблема в том, что, если использую InvalidateRect(hWnd, 0, true), то тогда при рисовании второй линии первая исчезает, а если использовать InvalidateRect(hWnd, 0, false), то линии рисуются при каждом Mouse Move с нажатой клавишей, а предыдущие не стираются. Помогите пожалуйста.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
int x=0;
int y=0;
int check=0;
int currentX, currentY, lastX, lastY;
 
void line(HDC _hdc,int x1,int y1,int x2,int y2)
{
    MoveToEx(_hdc,x1,y1,NULL);
    LineTo(_hdc,x2,y2);
}
 
case WM_LBUTTONDOWN:
    hdc = GetDC(hWnd);
    //for line
    if (check==1)
    {
        x = LOWORD(lParam); 
        y = HIWORD(lParam);
    }
    break;
 
case WM_LBUTTONUP:
    hdc = GetDC(hWnd);
    lastX= LOWORD(lParam);
    lastY = HIWORD(lParam);
    break;
 
case WM_MOUSEMOVE:
    hdc = GetDC(hWnd);
    //line
    if (wParam & MK_LBUTTON)
    {
        if (check==1)
        {
            currentX=LOWORD(lParam);
            currentY=HIWORD(lParam);
            qLineColor = RGB(255,0,0);
            hLinePen = CreatePen(PS_SOLID,7,qLineColor);
            hPenOld=(HPEN)SelectObject(hdc,hLinePen);
            InvalidateRect(hWnd,0,true);    
        }
    }
        break;
 
case WM_PAINT:
    hdc = BeginPaint(hWnd, &ps);
    //TODO: Add any drawing code here...
    HPEN hPenOld;
    //Draw a red line
    HPEN hLinePen;
    COLORREF qLineColor;
    qLineColor = RGB(255,0,0);
    hLinePen = CreatePen(PS_SOLID,7,qLineColor);
    hPenOld=(HPEN)SelectObject(hdc,hLinePen);
 
    if (check==1)
    {
        line(hdc,x,y,currentX,currentY);
    }
        SelectObject(hdc,hPenOld);
    DeleteObject(hLinePen);
    EndPaint(hWnd,&ps);
    break;
Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
07.11.2012, 22:52
Ответы с готовыми решениями:

Как в VB сделать паузу больше,чем в одну минуту?
Как в VB сделать паузу больше,чем в одну минуту,например в полчаса?

Как рисовать линию с координатами double
здравствуйте, на C# пишу несколько дней в основном пишу на java, решил написать программу которая строит график функции по задонойфункции...

Почему Microsoft больше не публикует книги по Win32 API? В частности, разработка графического интерфейса с Win32
Кто-нибудь знает, почему Microsoft перестала публиковать книги по программированию Win32 GUI? Я использую электронную книгу...

1
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
07.11.2012, 23:49
при таком дизайне врятли у вас что-то хорошее получится.
примерное решение может быть таким:
пусть есть объект линия, в котором есть поля: координаты первой точки, координаты второй точки и цвет. при перерисовки окна нужно прорисовывать все линии из этого массива. кроме этого есть еще временный объект линии, который тоже должен прорисовываться, если он есть.
когда юзер тыкает мышкой по экрану, появляется этот временный объект линии, у которого первая точка - это координаты щелчка, вторая точка - координаты мыши. когда юзер отпускает мышку, копия этой линии попадает в массив, а сам объект временной линии исчезает и больше не прорисовывается, пока юзер не повторит то, что проделал первый раз. тут появляется возможность редактировать уже имеющиеся линии, удалять их и т.п. можно кстати без этой временной линии и обойтись одним лишь массивом. когда юзер тыкает мышкой, в конец массива заносится новая линия. когда он двигает мышкой, вторая точка этой последней линии подправляется на координаты мышки и посылается запрос на перерисовку. перерисовка простая - пробежать по всему массиву линий и нарисовать их.

Тут нужно еще вспомнить классический пример ООП - базовый класс фигуры и всякие производные от него. В этом случае можно будет работать не только с линиями, но и с любыми другими фигурами.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2012, 23:49
Помогаю со студенческими работами здесь

Исходник LineTo(),или как рисовать линию
Исходник LineTo(),или как рисовать линию по одному пикселю зная только координаты начальной точки и градус? Я пытался вот так: class...

Разработать программу позволяющюю рисовать линию между точками
народ хелп, уменя экзамен, а я не знаю 1 задачу. Разработать программу позволяющюю рисовать линию между точками. точки отмечаются кликом...

Рисовать в Win32 как в Paint
Как можно нарисовать прямоугольник и другие фигуры так чтобы было видно уже нарисованые фигуры через те что будут рисоватся.Тоесть надо их...

Как рисовать линию с помощью мыши, не стирая уже нарисованного
public partial class Form1 : Form { Int32 x_begin = new Int32(); Int32 y_begin = new Int32(); Int32...

Прекратить рисовать линию, если ее конец достиг другой нарисованной фигуры (круга)
Доброго времени суток! Рисую в GDI. Мне необходимо нарисовать окружность и стрелку к ней (стрелка может быть нарисована в любой части...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru