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

Движение мыши (переполнение)

11.08.2012, 21:48. Показов 1727. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
10
if (capture)
        {
            if (moved)
            {
                c[ind].vx = mCur.x-mPrev.x;
                c[ind].vy = mCur.y-mPrev.y
            }
            ReleaseCapture();
            capture = moved = FALSE;
        }
Так я устанавливаю скорость движения объекта. Однако, так как отсчет идет от левой верхней точки, то, если мышь ушла за неё, координаты уходят в минус, но, так как координаты mCur и mPrev извлекаются примерно так :
C++
1
2
3
case WM_MOUSEMOVE :
mCur.x = LOWORD(lParam);
mCur.y = HIWORD(lParam);
То происходит переполнение и то самое LOWORD иль HIWORD становится равен 65536. И тут уже со скоростью не поработать.
Вопрос : так как же все-таки получить координаты мыши в знаковом типе или относительно экрана вообще, а не приложения? А может можно установить систему координат в реальную левую верхнюю часть монитора, а не приложения?

p.s Да, я могу, конечно, сделать что-то типа :
if (mCur.x > 3000)
mCur.x = -(65536-mCur.x);
ибо экран в 3000 пикселей не будет точно, но не хотелось бы пользоваться подобным хаком

Добавлено через 1 час 15 минут
Или может уже есть функция, возвращающая смещения мыши в качестве "prev.x/y - cur.x/y"?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.08.2012, 21:48
Ответы с готовыми решениями:

Перехватить движение мыши за пределами окна
Хочу сделать чтобы изменение положения и размеров формы происходило в старом стиле, я перехватил WM_NCLBUTTONDOWN, но при выходе мыши за...

Выбивает ошибку при движение колесика мыши
При движение колесика мыши выбивает ошибку. Помогите исправить. class Application { public: Application(HINSTANCE...

Отследить движение мыши в окне, созданном при помощи mciSendString
Здравствуй те Господа !!! Возник вопрос - допустим есть некое чужое окно (скажу сразу это не вирус , а окно созданное при открытии .avi...

11
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.08.2012, 23:29
Что-то я не понял... откуда там переполнение?
LOWORD(lParam) и HIWORD(lParam) в WM_MOUSEMOVE должны быть всегда позитивные относительно верхнего-левого угла клиентской части окна.
0
12.08.2012, 06:21

Не по теме:

Цитата Сообщение от nexen Посмотреть сообщение
ибо экран в 3000 пикселей не будет точно, но не хотелось бы пользоваться подобным хаком
Ой, ли. Даже не задумываясь о том, есть ли такие мониторы сейчас. Можно иметь два монитора, например, с разрешением 2560x1600 и растянуть окно приложения на оба экрана. :D

2
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2012, 10:30  [ТС]
lazybiz, эм, я про то и говорил. Ведь, делая захват мыши, я могу уйти за пределы окна (в самую левую верхнюю часть монитора, где клиентская область закончилась) и тогда у меня начнутся проблемы, ибо
LOWORD - дает 2 байта
HIWORD - дает 2 байта (<<16)
а 2^16=65536. Так как это беззнаковый тип, то я и получаю, что при координате "(-1,-1)", у меня будет число 0xFFFF. Вот вам и "переполнение"

Добавлено через 3 часа 22 минуты
up-to-date ? : (
0
Модератор
Эксперт по электронике
8981 / 6748 / 921
Регистрация: 14.02.2011
Сообщений: 23,871
12.08.2012, 10:33
Цитата Сообщение от nexen Посмотреть сообщение
получить координаты мыши в знаковом типе или относительно экрана вообще, а не приложения?
ScreenToClient()
ClientToScreen()
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2012, 12:08  [ТС]
ValeryS, спасибо конечно, но она работает примерно так :
point.x += dx;
point.y += dy; // где dx и dy - смещение приложения относительно левого верхнего края экрана.
Так что это никак не меняет того, что изначально LOWORD возвращается over 60.000 значение при отрицательных координатах. А ведь именно из LOWORD и HIWORD состоит тот самый point, который посылается в функцию.

Так что, вопрос открыт
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33399 / 21509 / 8236
Регистрация: 22.10.2011
Сообщений: 36,907
Записей в блоге: 12
12.08.2012, 12:43
GET_X_LPARAM + GET_Y_LPARAM на что были придуманы?
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2012, 13:25  [ТС]
Цитата Сообщение от UI Посмотреть сообщение
GET_X_LPARAM + GET_Y_LPARAM на что были придуманы?
Огромное спасибо! Не знал вообще о "Windowsx.h" ; (
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
12.08.2012, 14:52
nexen, вообще-то WM_MOUSEMOVE посылается окну только когда курсор находится на окне, а не за его пределами.
0
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2012, 15:03  [ТС]
Цитата Сообщение от lazybiz Посмотреть сообщение
nexen, вообще-то WM_MOUSEMOVE посылается окну только когда курсор находится на окне, а не за его пределами.
Вы ошибаетесь. Как я уже писал, у меня захват, а он позволяет посыл сообщений типа WM_MOUSEMOVE за пределами клиентской области
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
12.08.2012, 15:26
Цитата Сообщение от nexen Посмотреть сообщение
Вы ошибаетесь. Как я уже писал, у меня захват, а он позволяет посыл сообщений типа WM_MOUSEMOVE за пределами клиентской области
Не нашел где ты это писал.
В общем теперь я понял что у тебя, ты не пробовал в качестве переменных использовать знаковые целые 16-битовые переменные?
И соответственно получать значения так:
C
1
2
3
signed short new_x, new_y;
new_x = (signed short)LOWORD(lParam);
new_y = (signed short)HIWORD(lParam);
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
12.08.2012, 15:41  [ТС]
Цитата Сообщение от nexen Посмотреть сообщение
Ведь, делая захват мыши, я могу уйти за пределы окна
Цитата Сообщение от nexen Посмотреть сообщение
C++
1
ReleaseCapture();
А проблему мне уже выше решили. Я глянул windowsx и понял, как там решается эта проблема. Кстати так, как вы и написали. Но всё равно спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.08.2012, 15:41
Помогаю со студенческими работами здесь

Движение мыши с точки А в точку Б с зажатой правой кнопкой мыши
Здравствуйте, мне нужно сделать программу которая бы плавно перемещала курсор мыши из А в Б причем с зажатой правой кнопкой мыши. С С#...

Движение по клику мыши
Здравствуйте! Можно ли сделать так, чтобы объект в форме мог двигаться туда, куда был сделан клик мышкой. Если всё, что я написал...

Движение мыши по кругу
Здравствуйте! Возникла следующая задача: Необходимо заставить курсор мыши двигаться по кругу и при смещении, на некоторое значение,...

Движение мыши на форме
Написать программу которая при создании формы размещает на ней поле Edit &quot;измените местоположение курсора мыши на форме&quot;. Если мышь...

задача на движение мыши!
Создать процедуру, которая меняет цвет формы в зависимости от направления движения мыши: движение влево - цвет зеленый, вправо - красный. ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru