Полоса прокрутки перемещается назад после WM_VSCROLL - PullRequest
3 голосов
/ 16 мая 2010

У меня есть окно с собственной прокруткой H и V. Я занимаюсь этим событием так:

case WM_VSCROLL:

        SetScrollPos(hWnd, SB_VERT, (int)HIWORD(wParam), TRUE);

        break;

все, что я хочу, это чтобы положение полосы прокрутки оставалось после того, как я отпустил мышь, но после этого я просто возвращаюсь к вершине. Что я делаю не так?

Спасибо

Ответы [ 2 ]

10 голосов
/ 16 мая 2010

Параметр wParam сообщения WM_VSCROLL имеет значение SB_TOP, SB_BOTTOM, SB_PAGEUP, SB_PAGEDOWN, SB_LINEUP, SB_LINEDOWN, SB_THUMBPOSITION или SB_THUMBTRACK, где имена должны объясниться.

  • SB_TOP и SB_BOTTOM означает, что окно прокрутки должно идти вверх или вниз соответственно. Эти сообщения можно отправить, щелкнув правой кнопкой мыши вертикальную полосу прокрутки и выбрав «Вверх» и «Вниз». (Смотрите в Windows Notepad, Win XP +, например.)

  • SB_PAGEUP и SB_PAGEDOWN означает страницу (экран) вверх или вниз. Они отправляются, если вы щелкнете где-нибудь на полосе прокрутки рядом с большим пальцем или стрелками вверх или вниз, или если вы используете контекстное меню полосы прокрутки.

  • SB_LINEUP и SB_LINEDOWN отправляются, когда пользователь нажимает кнопки вверх и вниз на полосе прокрутки или выбирает соответствующие команды меню, вызываемые правой кнопкой мыши.

  • SB_THUMBTRACK отправляется непрерывно, когда пользователь выполняет прокрутку с помощью большого пальца полосы прокрутки.

  • SB_THUMBPOSITION отправляется, когда пользователь отпустил большой палец.

См. Статью MSDN WM_VSCROLL для получения дополнительной информации.

Итак, когда вы получаете сообщение WM_VSCROLL, вам сначала нужно выполнить саму прокрутку. Например, если вы пишете текстовый редактор, вам нужно перерисовать текст, но с другой строкой в ​​верхней части окна. Затем вам нужно обновить полосу прокрутки до ее новой позиции, предпочтительно с помощью SetScrollInfo, но вы также можете использовать старую функцию SetScrollPos.

0 голосов
/ 10 октября 2016

В разделе case система обрабатывает сообщение WM_VSCROLL. После запуска SetScrollPos будет запущена процедура окна по умолчанию. В стандартной процедуре окна система сама установит положение большого пальца полосы прокрутки. Таким образом, хотя SetScrollPos действует, система все равно меняет положение большого пальца после этого. Я думаю, что вы должны сделать SetScrollPos после вызова оконной процедуры по умолчанию, то есть, возможно, после возврата этой функции, а затем вы можете SetScrollPos.

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