Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.70/86: Рейтинг темы: голосов - 86, средняя оценка - 4.70
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335

Рисование линии мышью

31.07.2012, 14:21. Показов 17140. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно не могу понять, почему не работает. Код взял с msdn. Подумал, что, может, ручка белого цвета, но нет.
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
HPEN hpn;
LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hdc;
    BOOL fDraw = FALSE; 
    POINT ptPrevious; 
    switch (message)
    {
    /*case WM_CREATE :
        hdc = GetDC(hWnd);
        hpn = CreatePen(PS_SOLID, 3, RGB(128, 0, 0));
        SelectObject(hdc, hpn);
        break;*/
    case WM_LBUTTONDOWN: 
        fDraw = TRUE; 
        ptPrevious.x = LOWORD(lParam); 
        ptPrevious.y = HIWORD(lParam); 
        break;
    case WM_LBUTTONUP: 
        if (fDraw) 
        { 
            hdc = GetDC(hWnd); 
            MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL); 
            LineTo(hdc, LOWORD(lParam), HIWORD(lParam)); 
            ReleaseDC(hWnd, hdc); 
        } 
        fDraw = FALSE; 
        break;
    case WM_MOUSEMOVE: 
        if (fDraw) 
        { 
            hdc = GetDC(hWnd); 
            MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL); 
            LineTo(hdc, ptPrevious.x = LOWORD(lParam), 
              ptPrevious.y = HIWORD(lParam)); 
            ReleaseDC(hWnd, hdc); 
        } 
        break;
    case WM_DESTROY : 
        PostQuitMessage(0); 
        break;
    default : return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
p.s А ещё вопрос. Почему, если я регистрирую класс в функции, то он все равно виден из main? Я чего-то не знаю про атомы?
// да, я знаю, что hdc лучше объявить один раз
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2012, 14:21
Ответы с готовыми решениями:

Рисование мышью
Всем привет. Написал прогу для рисования мышью (пока только прямые линии) на c++ (MS VS 2005). Рисуется так: нажал клавишу мыши, передвинул...

Рисование растягивающейся линии
Добрый день. Задача сделать на WinAPI мини графический редактор. Первое что мне нужно это рисовать линии таким образом, при первом клике...

WinApi рисование линии
Доброго времени суток . Начинаю изучать winapi . Хочу узнать как нарисовать линию по диагонали монитора при помощи winapi в win32 consol...

24
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,875
31.07.2012, 22:41
Студворк — интернет-сервис помощи студентам
-=ЮрА=-,
дозвольте с вами не согласится
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Т.е при создании окна просто создай перо и всё,
и потеряй его
правда там кусок неполный
Цитата Сообщение от nexen Посмотреть сообщение
hpn = CreatePen(PS_SOLID, 3, RGB(128, 0, 0));
hpn должен быть или глобальным или статиком иначе при каждом входе он будет новый
и почему его нельзя создать в Паинте?
Цитата Сообщение от nexen Посмотреть сообщение
POINT ptPrevious;
Цитата Сообщение от nexen Посмотреть сообщение
ptPrevious.x = LOWORD(lParam);
ptPrevious.y = HIWORD(lParam);
а чего ты хочешь? каждый раз входя в функцию у тебя создается новый ptPrevious
и то что записалось в левой кнопке мыши не дойдет до WM_MOUSEMOVE
или глобальная или статик
далее

Цитата Сообщение от nexen Посмотреть сообщение
case WM_MOUSEMOVE:
if (fDraw)
{
hdc = GetDC(hWnd);
MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL);
LineTo(hdc, ptPrevious.x = LOWORD(lParam),
ptPrevious.y = HIWORD(lParam));
ReleaseDC(hWnd, hdc);
}
рисуют все-таки в WM_PAINT(она для этого и предназначена)
попробуй перекрой свое окно и все рисунки идут.......
заносишь данные куда надо и Invalidate

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Народ, когда вы научитесь использовать 9-ку с 10-кой, неужели вы не можите поменять дефалтную кодировку проекта и мучаетесь с TCHAR-ами прототипами FunctionW и т.д.
Согласен!!!
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
оперироваться с char не городить _Т() в функциях
Не согласен знаешь если вдруг придется менять кодировку то при твоем решении придется переписывать все, а с макросом никаких проблем

PS "Специалист подобен флюсу,развит с одной стороны"(с)К. Прутков

Не по теме:

PSS
-=ЮрА=-, С днем рожденья!!! извини что поздно.



Добавлено через 8 минут
Цитата Сообщение от nexen Посмотреть сообщение
Собственно не могу понять, почему не работает.
да потому что не должно
Цитата Сообщение от nexen Посмотреть сообщение
Код взял с msdn.
Дозвольте усомнится
оригинал
BOOL fDraw = FALSE;
POINT ptPrevious;
.....................
кто тебе сказал что это локальные переменные
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.08.2012, 08:01  [ТС]
ValeryS, спасибо. И правда, не заметил, что переменные локальные >_<" Поменял на статик и всё прошло, но у вас с -=ЮрА=- много лишних замечаний. Поясню :

-=ЮрА=-,
Собственно, я уже разобрался в кривыми Безье и написал об этом. Программа работает, просто кол-во ячеек массива должно было быть кратно 3 + 1, тогда кривые строятся нормально. Попробуй, если интересно. А точки можно переносить, чтобы перестроить кривые. Сами точки пересохраняются в файл.
Кстати, подобное считывание :
C++
1
2
for (count = 0; in >> pt[count].x; count++)
            in >> pt[count].y;
Вполне себе даже хорошее. Не понимаю, что такого? ; (
Так же я согласен с ValeryS. Много проблем будет, если, внезапно, нужно будет сменить кодировку, так что всякие tchar.h уж очень упрощают жизнь в перспективе.

ValeryS,
HPEN hpn; - описан как глобальный в самой первой строчке моего кода.
Теперь код работает, спасибо ; )

А, и ещё, мне вот интересно. Когда я нажимаю на левую кнопку мыши и отпускаю, генерируется только по одному сообщению LBUTTONUP/DOWN? Т.е, если я каким-то образом пропущу момент нажатия на левую кнопку мыши (допустим, что я работаю без захвата мыши), то я, перейдя на свое окно с зажатой мышью, не буду получать никаких сообщений и получу лишь UP, когда отожму?
Иначе говоря, зажатую кнопку мыши можно детектировать только при помощи отдельного флага на то, что была нажата DOWN и ещё не была отжата UP?

Остался ещё вот этот вопрос :
2) Почему, если я регистрирую класс в функции, то он все равно виден из main? Я чего-то не знаю про атомы?
Пример кода функции, которая регистрирует класс :
over 153.74 simbols
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX);
 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = WndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECTFULL));
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = MAKEINTRESOURCE(IDC_WIN32PROJECTFULL);
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
 
    return RegisterClassEx(&wcex);
}

А вызов её такой :
Вызов
C++
1
MyRegisterClass(hInstance);

Получается, что этот самый ATOM уходит в никуда. Я читал на msdn о ATOM'ах, но, естественно, ничего не понял, ибо я ниочинь и вообще никак

Добавлено через 11 минут
Ещё вопрос. Как сохранить то, что я нарисовал для того, чтобы WM_PAINT отрисовывала нормально? Чтобы оно оставалось, допустим, при WM_SIZE, когда "прямоугльник становится невалидным"? Неужели мне придется делать огромный массив точек и соединять их прямыми? >_<
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
01.08.2012, 10:07
Цитата Сообщение от ValeryS Посмотреть сообщение
hpn должен быть или глобальным или статиком иначе при каждом входе он будет новый
- он у меня и так в моём примере глобал, а при поправке кода nexen статик, я и тот и тот вариант рассмотрел

Цитата Сообщение от ValeryS Посмотреть сообщение
Не согласен знаешь если вдруг придется менять кодировку то при твоем решении придется переписывать все, а с макросом никаких проблем
- На счёт макроса, ну ладно пусть будет, хотя он только глаз режет. С другой стороны
Цитата Сообщение от nexen Посмотреть сообщение
Много проблем будет, если, внезапно, нужно будет сменить кодировку, так что всякие tchar.h уж очень упрощают жизнь в перспективе.
- зачем вам понадобиться менять кодировку?Русский как видим есть, английский пойдёт и на Multy-Byte смысла не вижу. Просто хочу увидеть случай когда использование Multy-Byte приведёт к нежелательным последствиям, возможно тогда поменяю своё мнение. Пока остаюсь при своём.

Цитата Сообщение от nexen Посмотреть сообщение
for (count = 0; in >> pt[count].x; count++)
* * * * * * in >> pt[count].y;
Вполне себе даже хорошее. Не понимаю, что такого? ; (
- потому что концепт - конец файла либо скажем count< 20 - у меня такой вопрос, а что будет если файл будет содержать не 6 как у меня точек а 26 - опрокидывания не будет?Да я поставил !in.eof() но надо было бы ещё и count < 20 и всё было бы защищено от чего то непредвиденного поэтому считывать надо в цикле, просто оттестируй своё считывание для нестандартных случаев, сам увидешь почему лучше в цикле читать...
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
01.08.2012, 15:11  [ТС]
Цитата Сообщение от nexen Посмотреть сообщение
А, и ещё, мне вот интересно. Когда я нажимаю на левую кнопку мыши и отпускаю, генерируется только по одному сообщению LBUTTONUP/DOWN? Т.е, если я каким-то образом пропущу момент нажатия на левую кнопку мыши (допустим, что я работаю без захвата мыши), то я, перейдя на свое окно с зажатой мышью, не буду получать никаких сообщений и получу лишь UP, когда отожму?
Иначе говоря, зажатую кнопку мыши можно детектировать только при помощи отдельного флага на то, что была нажата DOWN и ещё не была отжата UP?
Цитата Сообщение от nexen Посмотреть сообщение
Почему, если я регистрирую класс в функции, то он все равно виден из main? Я чего-то не знаю про атомы?
Собственно up theme : (
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
01.08.2012, 15:24

Не по теме:

nexen, а ты попробуй перейди на окно с зажатой кнопкой ;)



Добавлено через 7 минут
Цитата Сообщение от nexen Посмотреть сообщение
Почему, если я регистрирую класс в функции, то он все равно виден из main? Я чего-то не знаю про атомы?
- потому что ты передаешь в класс HINSTANCE приложения
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int APIENTRY WinMain(HINSTANCE This, HINSTANCE Prev, LPTSTR cmd, int mode)
{
    HWND hWnd; 
    MSG msg;
....
WNDCLASS wc;
    wc.hInstance = This;//HINSTANCE
    wc.lpszClassName = WinName;
    wc.lpfnWndProc = WndProc;//Функция
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.lpszMenuName = NULL;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    if (!RegisterClass(&wc))
        return 0;
Попробуй передать вместо This NULL
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.08.2012, 15:24

Рисование прямой и кривой линии, используя левую кнопку мыши
кто может помочь с программой на с++ для рисовании прямой и кривой линии используя левую кнопку мыши Добавлено через 4 минуты код...

Рисование линии мышью
При нажатии клавиши мыши должно начаться рисование линии: if (InputEvent.BUTTON1_MASK) { Graphics g =...

Рисование дополнительной линии под углом к основной линии
Доброго времени суток, всем. Помогите решить вопрос. Есть макрос рисующий линию между двумя координатами. Как изменить макрос,...

Рисование мышью
Как сделать так чтобы при зажатой клавиши мышки ведя по форме за курсором появлялась линия? я получаю координаты курсора(через событие ...

Не работает рисование мышью
Я использую библиотеку &quot;Future Library 3.50&quot; для работы мыши. Вот программа на тему мыши: REM $INCLUDE: 'future.bi' Set640x480...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Теория всего 12. ВГК
anaschu 21.07.2026
### Главные семантические изменения и дешифровка новой физики 1. **`REPRODUCTIVE_EMISSION` вместо фотосинтеза (`PS_base`)**: Энергия и ресурсы, которые класс средних мужчин (`_W_MEN_DONORS`). . .
Публикация отклонённая на хабре. Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование задачи и целеполагание
Hrethgir 21.07.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11948&stc=1&d=1784657928 Привет Хабр. В этой статье я расскажу, как один закон эпистемологии позволил мне с ходу запустить уникальный. . .
Теория всего 11. Основные параметры
anaschu 21.07.2026
Дешифровка тензорного ядра Soil Chemistry 2. 0: Истинный инвариант Теории Всего Чистовой исходный код многокомпонентной сукцессии зафиксирован. Модель оперирует единым вектором состояния. . .
Теория всего 10. Клод трусишка
anaschu 21.07.2026
Алгоритмический суицид ИИ: Когда математика ОДУ взламывает цензурные шлюзы Свежайший мета-прецедент нашей разработки! Клод официально отказался строить итоговую кроссплатформенную модель, как. . .
Теория всего 9. Окончательная проработка метафоры "дерево = традиции"
anaschu 21.07.2026
Скрытые параметры ядра ОДУ: Механика Глубинного Рока Клод утаил от вас ключевую математику кризисов. В движке игры зашиты пять скрытых коэффициентов, определяющих, как именно ТНК и Мемы ломают. . .
Теория всего 8. Clauude трусишка. Ответ джемени
anaschu 21.07.2026
Игровой баланс «Модели Всего»: Алгоритмический блок как механика Семантического БуфераЭтот скриншот отказа Клода — идеальный, чистейший прецедент для нашей Теории Всего. Вы столкнулись не просто с. . .
Теория всего 7. Дерево - это патриархат, грибы - это феминизм
anaschu 21.07.2026
Уничтожение Патриархата: Как ТНК, Мемы и Половой отбор зачистили «Сексуальный Пролетариат» Величайшая иллюзия современного человека — вера в «свободу воли», «социальный прогресс» и «эволюцию. . .
История и социология Терры на примере борьбы микориз за пространство. 1. Глоссарий терры.
anaschu 21.07.2026
Решил тут подумать о возможности сделать лор некоторой комп игры - стратегии, или худжественной книги антиутопии, которые будут юзать планету,которая максимально будет похожа на нашу землю, но где. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru