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

ClipCursor для WM_SIZE

20.08.2012, 13:17. Показов 2138. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В сообщении о изменении размера WM_SIZE ставлю следующее :
GetWindowRect(hWnd, &r);
ClipCursor(&r);
Но, почему-то, при изменении размера окна (больше его сделать нельзя, ибо идет привязка, а вот меньше можно) привязка сбрасывается.
r - static RECT.

Добавлено через 16 часов 46 минут
up-to-date

Добавлено через 6 часов 38 минут
up-to-date
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.08.2012, 13:17
Ответы с готовыми решениями:

Артефакты при WM_SIZE
Всем, доброго дня второй день не могу решить вопрос: На форме 2 кнопки (90x30px) в правом нижнем...

WM_SIZE и перерисовка окна
Добрый день. Всех с праздником! Возникла такая проблема: при максимизации\минимизации или любом...

WM_SIZE и кнопки в диалоговом окне
Всем привет! Создаю диалоговое окно из rc-файла, начальные размеры окна и координаты кнопок...

Как отловить событие WM_SIZE?
создаю окно, wndproc switch (Message) { case WM_CLOSE: case WM_SIZE:...

7
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32991 / 21297 / 8180
Регистрация: 22.10.2011
Сообщений: 36,591
Записей в блоге: 8
20.08.2012, 14:43 2
А теперь - подробно, чего ты хочешь добиться? Того, чтобы курсор всегда был "заперт" в твоем окне? Не надо этого делать, курсор - разделяемый ресурс, а не твой личный. Зачем понадобилось по WM_SIZE вызывать ClipCursor, да еще и нигде не освобождая?..
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
20.08.2012, 15:02  [ТС] 3
UI, вопрос был не в том. Мне лишь интересно, почему оно не срабатывает.
По идее, даже если я вышел за пределы дозволенной границы, то CliCursor должна вернуть курсор на место. На msdn нет ничего о том, в каких случаях она сбрасывается.
p.s Но на самом деле применение для данной функции я найти могу в своем приложении, в котором просчитывается скорость относительно мыши. Хоть и стоит SetCapture, но когда приложение создает "реальную" стенку гораздо проще оперировать с такой функцией
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32991 / 21297 / 8180
Регистрация: 22.10.2011
Сообщений: 36,591
Записей в блоге: 8
20.08.2012, 15:38 4
Обрабатывай не только WM_SIZE, а еще и WM_EXITSIZEMOVE, которое отсылается, когда ресайз/перемещение окна завершены. Нет. Даже не так. Скорее, вот так: WM_SIZE - только для того, чтобы изначально "запереть" мышь, потом от него толку нет. Основную работу делает WM_EXITSIZEMOVE:

C++
1
2
3
4
5
        case WM_SIZE:
        case WM_EXITSIZEMOVE:
            GetWindowRect(hwnd, &r);
            ClipCursor(&r);
            return 0;
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
20.08.2012, 16:12  [ТС] 5
UI, спасибо. Помогло.
Однако все равно не понятно мне, почему не работает с сообщение WM_SIZE. Разве не получается так, что посылается туча сообщений на WM_SIZE, когда я растягиваю окно, и каждое это сообщение устанавливает захват на новый размер клиентского окна? Даже если всё и завершает функция WM_EXITSIZEMOVE, то перед тем, как отпустить кнопку мыши, изменение в WM_SIZE уже произошли и, как минимум, должна остаться команда на захват ClipCursor. Но она снимается ;<
.
да, я упоротый
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32991 / 21297 / 8180
Регистрация: 22.10.2011
Сообщений: 36,591
Записей в блоге: 8
20.08.2012, 16:48 6
А теперь подумай, кто (и куда) посылает сообщение WM_SIZE. Как только пользователь нажал левую кнопку мыши на заголовке или на бордюре, ты получаешь WM_ENTERSIZEMOVE, и начинается модальный цикл перемещения/ресайза окна. В это время сообщения из очереди окном не обрабатываются (а получаешь ты WM_SIZE только потому, что тебе оно высылается не через очередь сообщений, а напрямую в оконную функцию). Выходит система из этого модального цикла только тогда, когда кнопка отпущена, и тебе об этом сигнализируют: WM_EXITSIZEMOVE.

Вероятно, если ClipCursor вызывать во время этого модального цикла, он не отрабатывает как положено (или вообще не отрабатывает). Другого объяснения у меня нет.
1
187 / 180 / 25
Регистрация: 27.01.2012
Сообщений: 1,335
20.08.2012, 17:42  [ТС] 7
UI, собственно он отрабатывает. BreakPoint на 1000hit'ов (WM_SIZE) спокойно преодолевает при изменении размера.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32991 / 21297 / 8180
Регистрация: 22.10.2011
Сообщений: 36,591
Записей в блоге: 8
20.08.2012, 18:06 8
В том, что ты получаешь 1000 сообщений WM_SIZE, и даже в том, что вызываешь 1000 раз ClipCursor() - я не сомневаюсь. А вот результат этого? Что дальше происходит после того, как вызвана ClipCursor()? В очередь окна засылается какое-то сообщение, которое должно быть обработано твоим окном? Что-то еще происходит? Но засылать сообщения бесполезно. Пока модальный цикл не завершится, оно обработано-то не будет. Равно и другие вещи могут не так работать. пока не начнется, собственно. выборка сообщений из очереди. Поэтому не надо вешать ClipCursor() на WM_SIZE (в первый раз, при инициализации окна, она отработала потому что никакого модального цикла не было, просто начальная установка размеров). Работай с окончанием drag-а.
1
20.08.2012, 18:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2012, 18:06
Помогаю со студенческими работами здесь

Как помимо сообщения WM_SIZE получить размеры клиентской области окна?
Как помимо сообщения WM_SIZE получить размеры клиенсткой области окна?

ClipCursor: курсор не удерживается в заданных координатах
Хотел подключить функцию ClipCursor. Написал вот такой код: private static extern bool...

Кроссплатформенный аналог Windows API функции ClipCursor(). Есть ли?
Пишу на с++, freeglut, openGL. Создаю glut-окно, создаю вьюпорт чтобы при растяжении окна glOrtho...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru