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

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

07.11.2012, 22:52. Показов 2510. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru