Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Системное программирование и WinAPI > Прокрутка скролла колесиком мыши


Автор: E.A. 17.04.19, 19:26
Запускаю приложение, там моя самодельная таблица типа Grid.
В ней есть скроллы, которые нормально работают, всё это в сабклассинге.

Появилась следующая проблема. Когда моё приложение теряет фокус, например запустил калькулятор, а затем вернулся к таблице, то перестает работать сабклассинг, причем только обработчик прокрутки колесика мыши, обработчики кнопок скролла, и бегунок скролла работают без проблем.

Автор: ЫукпШ 21.04.19, 11:38
Цитата E.A. @
Запускаю приложение, там моя самодельная таблица типа Grid.
В ней есть скроллы, которые нормально работают, всё это в сабклассинге.

Если это самодельный контрол, тогда исследовать
его работу можешь только ты сам.
---
я попробовал то же самое с Edit-ом - паталогии не обнаружено.
Всё работает по документации на WM_MOUSEWHEEL.
Если фокус на главном окне, эти сообщения приходят к нему.
Если фокус на дочернем Edit-е, сообщения получает Edit.
Дальше как сделаешь.
Если вызывается оригинальная процедура контрола (из процедуры
сабклассинга), сообщение WM_MOUSEWHEEL пересылается родительскому окну.
---
Для прокручивания скролла вовсе не обязательно делать это из сабклассинговой
процедуры. Если такие сообщения получает родительское окно, в его
обработчике вполне естественно решать такие вопросы.

Автор: ЫукпШ 22.04.19, 20:55
Цитата E.A. @
PS ещё такой вопросик в рамках этой же темы.
на просторах интернета я нашел два способа определения в какую сторону крутится колесико мыши.
1.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    zDelta = GET_WHEEL_DELTA_WPARAM(wparam)

2.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    zDelta = (((POINTS*)&wparam) -> y) / WHEEL_DELTA

я делал прямо по документации.
Всё работало правильно.
WM_MOUSEWHEEL
Цитата

...
wParam
The high-order word indicates the distance the wheel is rotated,
expressed in multiples or divisions of WHEEL_DELTA, which is 120.
A positive value indicates that the wheel was rotated forward, away from the user;
a negative value indicates that the wheel was rotated backward, toward the user.

и в итоге у меня было как то так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
     short int zDelta = (int) HIWORD(wParam); // wheel rotation
     short int status = (int) LOWORD(wParam);
     int points = zDelta / WHEEL_DELTA;
     bool decLN=true;
     
     if(points < 0)
     {
      points = - points;
      decLN = false;
     }
     if(status == MK_CONTROL)
     {
      if(decLN){decPageNumber();}
      else     {incPageNumber();}
     }
     else
     {
      for(int i=0;i<points;++i)
      {
       if(decLN){decLineNumber();}
       else     {incLineNumber();}
      }
     }

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)