Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/54: Рейтинг темы: голосов - 54, средняя оценка - 4.54
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105

Написать программу, которая по левому щелчку мыши выводила бы координаты курсора

12.07.2011, 19:34. Показов 10257. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток.
Win32 начал только изучать. Для практики, решил написать программу, которая по левому щелчку мыши выводила бы координаты курсора.
Вроде как сделал, но выглядит как велосипед. Просто я к этому долго приходил, было много заморочек с типами.
Вы как считаете, это нормально ?)

C++
1
2
3
4
5
6
7
8
9
10
11
case WM_LBUTTONDOWN:
{
    POINT pt;
    GetCursorPos(&pt);
    std::ostringstream out;
    out << "x = " << pt.x << ", "
         << "y = " << pt.y;
    std::string str = out.str();
    MessageBox(hWnd, str.c_str(), "", MB_OK);
    break;
}
Добавлено через 4 минуты
И вот еще, вопрос. Как я понял, он выдает мне экранные координаты, то есть отсчет идет от левого верхнего угла монитора. Как получать координаты относительно клиентской области?

Спасибо.

Добавлено через 9 минут
Попытался так -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
case WM_LBUTTONDOWN:
{
    GetClientRect(hWnd, &rect);
    GetCursorPos(&pt);
    int x = pt.x - rect.right;
    int y = pt.y - rect.bottom;
 
    std::ostringstream out;
    out << "x = " << x << ", "
         << "y = " << y;
    std::string str = out.str();
    MessageBox(hWnd, str.c_str(), "", MB_OK);
    break;
}
Думал будет работать, но координаты неправильные, да и отрицательные бывают =)

Добавлено через 58 минут
Ураа, нашел решение с помощью функции ScreenToClient, которая как раз приводит экранные координаты к координатам клиентской области.

C++
1
2
3
4
5
6
7
8
9
10
11
12
case WM_LBUTTONDOWN:
{
    GetClientRect(hWnd, &rect);
    GetCursorPos(&pt);
    ScreenToClient(hWnd, &pt); // !!!   
    std::ostringstream out;
    out << "x = " << pt.x << ", "
         << "y = " << pt.y;
    std::string str = out.str();
    MessageBox(hWnd, str.c_str(), "", MB_OK);
    break;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.07.2011, 19:34
Ответы с готовыми решениями:

Написать программу, которая будет рисовать на форме звезду по щелчку мыши
Приложение «Звезды» Написать программу, которая будет рисовать на форме звезду по щелчку мыши. В месте щелчка должен быть центр...

Написать программу которая будит выводить координаты мыши
Как вывести координаты на экран???

По левому шелчку мыши нарисовать олимпийский флаг, а по правому щелчку - красный шар
Всем привет сейчас сижу на экзамене нужна ваша помощь. Дали задание &quot;Создать программу, которая по левому щелчку мыши рисует на поверхности...

31
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
12.07.2011, 20:39
Цитата Сообщение от neske Посмотреть сообщение
Вы как считаете, это нормально ?)
Более, чем нормально. WinAPI сам по себе как велосипед, но работает..)
1
71 / 76 / 9
Регистрация: 30.06.2011
Сообщений: 176
12.07.2011, 21:53
Они же в LPARAM приходят эти координаты:
C++
1
2
3
4
case WM_LBUTTONDOWN:
  MouseXPos = LOWORD(lParam);
  MouseYPos = HIWORD(lParam);
break;
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.07.2011, 20:43  [ТС]
Не знал, спасибо

Добавлено через 22 часа 36 минут
Всем привет.
Возникла проблема с моим следующим экспериментом.
По щелчку мышу он должен рисовать эллипс.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
case WM_LBUTTONDOWN:                
    SendMessage(hWnd, WM_PAINT, wParam, lParam);
    break;
 
case WM_PAINT:
    hDC = BeginPaint(hWnd, &ps);
            
    SetBkMode(hDC, TRANSPARENT);
    GetClientRect(hWnd, &rect);
 
    if (lParam != 0) {
        int x = LOWORD(lParam);
        int y = HIWORD(lParam); 
        Ellipse(hDC, x, y, x + 100, y + 100);
    }
 
    EndPaint(hWnd, &ps);
    break;
Эллипс он не рисует. Где я ошибся?

Добавлено через 7 минут
Вот так рисует, но только один раз, то есть на первый щелчок реагирует, а на последующие уже нет.

C++
1
2
3
4
5
6
7
if (lParam != 0) {
    int x = LOWORD(lParam);
    int y = HIWORD(lParam); 
    hDC = BeginPaint(hWnd, &ps);
    Ellipse(hDC, x, y, x + 100, y + 100);               
    EndPaint(hWnd, &ps);
}
0
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
13.07.2011, 20:46
neske,

попробуйте в
C
1
WM_LBUTTONDOWN
добавить обновление клиентской области
C
1
InvalidateRect(hwnd, rect, TRUE);
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.07.2011, 20:50  [ТС]
nameless, я не понимаю логически, почему мой код не работает.
Рассуждал так.
Я нажимаю на мышь, генерируется WM_LBUTTONDOWN. Оттуда мы вызываем WM_PAINT, куда передаем все параметры. Мы изымаем координаты мыши, как мне посоветовали раньше, и рисуем эллипс. Где я ошибся?
Посмотрел в справке, что в WM_PAINT параметр lParam не используется, то есть равен нулю, я подумал) я сделал в проверку, в if у меня заходит всегда, но не рисует.
0
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
13.07.2011, 21:00
neske, отправка сообщения SendMessage(hWnd, WM_PAINT, wParam, lParam) не перерисовывает окно. Посылка сообщения WM_PAINT это только сигнал окну, что у него есть область, которую надо перерисовать, используйте InvalidateRect(), которая пометит окно как невалидное, и система сама пошлет WM_PAINT когда нужно. Также можно использовать RedrawWindow(), которая вызывает перерисовку немедленно, но это визуально выглядит не очень хорошо, скажем так.
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.07.2011, 21:03  [ТС]
А, понял, спасибо.
Если я буду использовать InvalidateRect, то как мне передать параметры из WM_LBUTTONDOWN в WM_PAINT? Вытаскивать координаты прям из WM_PAINT не вариант, т.к. я хочу конкретно по щелчку мыши.
0
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
13.07.2011, 21:06
neske, Заведите глобальную static переменную POINT pt, по щелчку GetCursorPos(&pt); Как у вас в первом посте описано было..
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.07.2011, 21:10  [ТС]
Да, действительно =)
А тогда, как мне в WM_PAINT определить, рисовать эллипс или нет? Ведь опять же, только по щелчку мыши.

Вы извините за такое кол-во вопросов, просто это первый опыт)
0
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
13.07.2011, 21:13
Цитата Сообщение от neske Посмотреть сообщение
А тогда, как мне в WM_PAINT определить, рисовать эллипс или нет?
Немного не понял, зачем это определять, если тыкнули в области, перерисуется, не тыкнули, то соответсвенно - нет. Никаких проверок вроде не нужно, если, я конечно, правильно понимаю Ваш вопрос.
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.07.2011, 21:14  [ТС]
Ну вот, при создании окна, к примеру, тоже вызывается WM_PAINT, но рисовать не нужно.
0
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
13.07.2011, 21:19
neske, задайте флажок какой-нибудь state = FALSE;
В WM_PAINT проверяйте если state == TRUE -> рисуем;
При нажатии на кнопку state = TRUE; Так вполне сносно
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.07.2011, 21:34  [ТС]
Вроде бы все сделал как вы сказали, но не рисует. Что не так?)

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <windows.h>
#include "KWnd.h"
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
POINT pt;
BOOL flag = false;  
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                   LPSTR lpCmdShow, int nCmdShow)
{
    MSG msg;
    KWnd mainWnd("A Hello application", hInstance, nCmdShow, WndProc);
 
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return msg.wParam;
}
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;
    int userReply;
    
 
    switch (uMsg) {
        case WM_LBUTTONDOWN:
        {
            flag = true;
            GetCursorPos(&pt);
            ScreenToClient(hWnd, &pt);
            InvalidateRect(hWnd, &rect, TRUE);
            //UpdateWindow(hWnd);
            break;
        }
 
        case WM_CREATE:
            SetClassLong(hWnd, GCL_HBRBACKGROUND,
                        (LONG)CreateSolidBrush(RGB(200, 160, 255))
            );
            break;
 
        case WM_PAINT:
            {
            hDC = BeginPaint(hWnd, &ps);
        
            SetBkMode(hDC, TRANSPARENT);
            GetClientRect(hWnd, &rect);
 
            if (flag) {
                Ellipse(hDC, pt.x, pt.y, pt.x + 100, pt.y + 100);   
                                flag = false;
                                 }
 
            EndPaint(hWnd, &ps);
            break;}
 
        case WM_CLOSE:
            
            userReply = MessageBox(hWnd, "You sure?", "", 
                MB_YESNO | MB_ICONQUESTION
            );
            if (IDYES == userReply)
                DestroyWindow(hWnd);
            break;
 
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
 
        default:
            return DefWindowProc(hWnd, uMsg, wParam, lParam);
    }
 
    return 0;
}
Добавлено через 1 минуту
Тут такие ужасные здоровые отступы, но это все форум)
0
Эксперт С++
 Аватар для nameless
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
13.07.2011, 21:36
Цитата Сообщение от neske Посмотреть сообщение
//InvalidateRect(hWnd, &rect, TRUE);
Зачем закомментили?
0
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.07.2011, 21:42  [ТС]
Да я исправил уже. Я пробовал и так, и UpdateWindow. В обоих вариантах он не рисовал.
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
13.07.2011, 21:51
рисоваться будут те объекты которые "живы" в динамической памяти. у них у каждого должна быть процедура отрисовки себя самого. и по WM_PAINT процедура перерисовки будет вызваться для каждого объекта и тогда для нас они будут нарисованы на экране. Объекты можно хранить в списке. По крайней мере так было в моем случае. вот рисовалка вымученная с экспериментами по апи
елси curve нарисовать лицо а потом нажать shoot интересно получается. наглядно видно из чего состоит изображение.

чорт в первом вложении дебуг положилDesktop.rar. во втором релиз. win2.rar

лоад загружает из текстового файла рисунок, а сэйв сохраняет в OU.txt
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.07.2011, 21:55  [ТС]
AzaKendler, скачал, но у меня на кнопки не нажать в программе. оО
0
 Аватар для AzaKendler
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
13.07.2011, 21:57
neske, ну..выбор фигуры я делал подсветку а вот выбор цвета ширины линии уже нет. надоело. но оно выбирается. поюзай.
когда нажат shoot незя рисовать. щут надо отжать. там просто изначально был выстрел - летела пуля круглая по дугообразной траектории и при попадании в нарисованый объект уничтожала его. наигравшись с этим захотелось сделать другое движение по экрану. а переделывть менюшку было лень
1
1552 / 918 / 193
Регистрация: 26.03.2010
Сообщений: 3,105
13.07.2011, 22:00  [ТС]
AzaKendler, да, все работает, прошу прощения.
попробую, спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2011, 22:00
Помогаю со студенческими работами здесь

Создайте программу, которая по правому щелчку мыши заполняет массив
Создайте программу, которая по правому щелчку мыши заполняет массив А(10) случайными числами, по нажатию клавиши «с» выводит в текстовое...

Написать программу, которая выводила бы на экран картинку
Написать программу, которая выводила бы на экран картинку. При этом каждый очередной прямоугольник должен выводиться при нажатии клавиши...

Написать программу, которая выводила бы 2 колонки с цифрами
Нужно написать программу, которая выводила бы 2 колонки с цифрами (в данном случае зарплата и налог). С первой колонной проблем нету, а со...

Написать программу, которая выводила бы в графическое окно набор графиков
Здравствуйте, Ув.програмисты, задали по информатике написать такие програмки, может ли кто-нибудь помочь? 3. Используя оператор цикла,...

Написать программу, которая в зависимости от введённого числа выводила бы на экран:
Написать программу, которая в зависимости от введённого числа выводила бы на экран:если 1, 2, 3, 4, 5 то 'один', если 6, 7, 10, 15 то...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru