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

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

31.07.2012, 14:21. Показов 16952. Ответов 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
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,863
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 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru