Не получается захватить колесо мышки

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Skwoogey
Сообщения: 63
Зарегистрирован: 11 янв 2016, 02:25

10 ноя 2016, 22:53

В общем, название двольно полно выражает проблему
вот код

Код: Выделить всё

	if(PeekMessage (&msg, MainHandle, 0, 0, PM_REMOVE))
        {
            if (msg.message == WM_MOUSEWHEEL)
            {
                cam->Zoom(GET_WHEEL_DELTA_WPARAM(msg.wParam));
            }
            else
            {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
        }
мое предположение, что glut запускает окно и рендер-функцию в разных потоках, а МДСН говорит, чтобы PeekMessage работало, они должны быть в одном потоке. Как обойти это дело, я не нашел. Что я делаю не так? Или может есть другой способ захватить колесико?
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

11 ноя 2016, 09:37

У glut свой собственный цикл обработки сообщений, так что мне интересно, где ты пытаешься "крутить" приведённый цикл... Скорее всего цикл вызывается только тогда, когда выполнение доходит до твоего кода (например, во время отрисовки), так что даже если это будет "иногда" работать, получить постоянную реакцию на вращение колёсика ты всё равно не сможешь.

Насколько я понимаю, наиболее правильное решение проблемы - это повесить хук на мышиные сообщения (см. SetWindowHookEx).

P.S. С glut никогда не работал. Все выводы сделаны на основании пары простеньких статей, которые только что прочёл для того, чтобы ответить тебе.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Din666
Сообщения: 51
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

11 ноя 2016, 16:06

можно повесить обработку колесика непосредственно в глуте.
См. пример: https://www.ecse.rpi.edu/Homepages/wrf/ ... eWheel.cpp

// Mouse wheel callback routine.
void mouseWheel(int wheel, int direction, int x, int y)
......
// Register the mouse wheel callback function.
glutMouseWheelFunc(mouseWheel);
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

11 ноя 2016, 17:17

Если есть готовый callback, то это значительно упрощает задачу.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Skwoogey
Сообщения: 63
Зарегистрирован: 11 янв 2016, 02:25

11 ноя 2016, 21:14

callback для колесика - привилегия фриглата (по крайней мере для винды). Glut-ов вообще несколько, конкретно мой не умеет. Да, логичнее всего просто фриглат поставить, но "вешать крюк" звучит гораздо веселее. В общем, спасибо за помощь.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

22 мар 2017, 08:51

А зачем вообще мучиться глутом? Пишите свой главный цикл и свои оконные "процедуры".
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

22 мар 2017, 08:59

Великолепная позиция.... Это всё равно, что ответить на твой вопрос в соседней теме следующее: А зачем ты вообще используешь системное окно редактирования? Напиши своё.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

22 мар 2017, 09:04

Одно дело мелкий кусок, например, редактирование текста в окне, а совсем другое - вся программа. Если так клевать на готовое, то берите уж целиком готовую софтину. Не устраивает? Странно. А писать мелкие куски в готовой софтине с закрытым исходником почему устраивает?
Напиши своё.
Ну может в конце концов так и сделаю. Когда надоест преобразовывать строку из UTF32 в UTF16 и обратно целиком.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

22 мар 2017, 09:11

А как по мне - идентичные ситуации.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1077
Зарегистрирован: 31 мар 2014, 06:18

22 мар 2017, 09:20

Romeo писал(а):А как по мне - идентичные ситуации.
Да ну! Ну попробуйте убедить Михалкова переделать "титаник" в следующую серию "утомлённых солнцем" путём вклеивания туда десяти своих кадриков, причём, вслепую и через замочную скважину. А включить в "в бой идут одни "старики"" кусок военной хроники - это как раз вполне возможно и замысла не рушит и на столе это делается гораздо удобней.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить