Примеры прокрутки Win32 - PullRequest
5 голосов
/ 02 мая 2010

Может кто-нибудь указать мне (или предоставить?) Несколько хороших, ясных примеров того, как реализовать прокрутку в Win32? Google, конечно же, предлагает много вещей, но большинство примеров кажутся либо слишком простыми, либо слишком сложными, чтобы я мог быть уверен, что они демонстрируют правильный способ ведения дел. Я использую LispWorks CAPI (кроссплатформенную библиотеку Common Lisp GUI lib) в моем текущем проекте, а в Windows у меня есть сложная ошибка, связанная с прокруткой; в основном я хочу провести некоторые тесты непосредственно через Win32 API, чтобы посмотреть, смогу ли я пролить свет на ситуацию.

Большое спасибо, Christopher

1 Ответ

0 голосов
/ 17 января 2011

Я думаю, что вы говорите для примера, как обрабатывать событие WM_VSCROLL / WM_HSCROLL. Если так, то первым шагом является обработка этого события. Вы не должны использовать значение HIWORD (wParam) этого вызова, но вместо этого использовать функции GetScrollInfo, GetScrollPos и ​​GetScrollRange.

Ниже приведен пример кода, отсекаемого MSDN - Использование полос прокрутки . xCurrentScroll определяется ранее, например, путем вызова GetScrollPos ().

int xDelta;     // xDelta = new_pos - current_pos  
int xNewPos;    // new position 
int yDelta = 0; 

switch (LOWORD(wParam)) { 
    // User clicked the scroll bar shaft left of the scroll box. 
    case SB_PAGEUP: 
        xNewPos = xCurrentScroll - 50; 
        break; 

    // User clicked the scroll bar shaft right of the scroll box. 
    case SB_PAGEDOWN: 
        xNewPos = xCurrentScroll + 50; 
        break; 

    // User clicked the left arrow. 
    case SB_LINEUP: 
        xNewPos = xCurrentScroll - 5; 
        break; 

    // User clicked the right arrow. 
    case SB_LINEDOWN: 
        xNewPos = xCurrentScroll + 5; 
        break; 

    // User dragged the scroll box. 
    case SB_THUMBPOSITION: 
        xNewPos = HIWORD(wParam); 
        break; 

    default: 
        xNewPos = xCurrentScroll; 
} 

[...]

// New position must be between 0 and the screen width. 
xNewPos = max(0, xNewPos); 
xNewPos = min(xMaxScroll, xNewPos); 

[...]

// Reset the scroll bar. 
si.cbSize = sizeof(si); 
si.fMask  = SIF_POS; 
si.nPos   = xCurrentScroll; 
SetScrollInfo(hwnd, SB_HORZ, &si, TRUE);
...