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

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

31.07.2012, 14:21. Показов 16976. Ответов 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
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru