Я отправляю этот ответ, чтобы помочь людям, которые находятся в той же ситуации, что и я.
1. Введение
Взаимодействие с полосой прокрутки может быть выполнено с помощью (вероятно, это не единственные существующие методы):
Первый метод ( SetScrollPos в сочетании с ScrollWindow ) требует управления всей информацией полосы прокрутки: размер прокрутки, текущая позиция, ... и пересчитывать ее для каждого OnSize () (что не слишком тривиально ...)
В режиме второго метода ( ScrollToPosition ) все, что нам нужно сделать, это вызвать ScrollToPosition
с желаемым размером прокрутки. Нам не нужно управлять деталями прокрутки, Windows делает это за нас!
По какой-то неизвестной мне причине функция прокрутки stylus
на Windows 10
не работает. имеют такое же поведение на Windows 7
: полоса прокрутки прокручивает , но не содержимое окна !!!
2. Решение
Потратив несколько часов на решение этой проблемы, я пришел к выводу, что простое решение для обхода этой проблемы - максимально возможное использование функции ScrollToPosition . И в этом случае вам просто нужно вычислить размер прокрутки (delta
), который определяется следующим образом:
Все, что вам нужно сделать, это вызвать функцию ScrollToPosition
с вычисленным delta
. Это позволит вам перейти от чрезвычайно сложного режима управления к нескольким вещам, которые выглядят так:
ON_WM_LBUTTONDOWN
void CMyView::OnLButtonDown (UINT nFlags, CPoint point)
{
// Code here ...
POINT p;
GetCursorPos(&p);
ScreenToClient ( &p); // Convert to screen coordinates
m_dragPosition = p; // m_dragPosition : member variable to store click position
m_bMouseDown = true; // Set Flag to true
CWnd::OnLButtonDown (nFlags, point) ;
}
ON_WM_LBUTTONUP
void CMyView::OnLButtonUp (UINT nFlags, CPoint point)
{
// Code here ...
m_bMouseDown = false;
CWnd::OnLButtonUp(nFlags, point);
}
ON_WM_MOUSEMOVE
void CMyView::OnMouseMove(UINT nFlags, CPoint point)
{
int delta = p.y - m_dragPosition.y;
// Use absolute value to take into account top/bottom scrolling
if ( abs (delta) > SCROLLING_STEP_SIZE)
{
CPoint pp = GetScrollPosition (); // Get current scrollbar position
pp.y += -delta;
pp.x = 0; // I'm intersting only for vertical scrolling
ScrollToPosition (pp); // Scroll to new position
UpdateWindow (); // This redraw new showed area
m_dragPosition = p; // Update drag position
}
}
Добавляя это, вы избегаете явного управления, которое совсем не тривиально ...
Надеюсь, это поможет тем кто в такой же ситуации как я