2010-05-02 4 views
4

Win32에서 스크롤링을 구현하는 방법에 대한 좋은 예가 있습니까? 구글은 분명히 많은 것을 가져다 주지만, 대부분의 예제는 너무 간단하거나 복잡해서 나에게 맞는 방법을 보여줄 수 없다. 현재 프로젝트에서 LispWorks CAPI (크로스 플랫폼 Common Lisp GUI lib)를 사용하고 있습니다. Windows에서는 스크롤과 관련하여 알아보기 힘든 버그가 있습니다. 기본적으로 Win32 API를 통해 몇 가지 테스트를 직접 수행하여 상황에 대해 밝힐 수 있는지 확인하려고합니다.Win32 스크롤링 예제

많은 감사, 크리스토퍼

+0

무슨 뜻인지 확실하지 않습니다. 창에 WM_SCROLLWINDOW 메시지를 보냄으로써 스크롤 할 것을 명령하면, 창에 정확하게 응답해야합니다. 문제가 발생하면 창에 올바른 메시지가 전송되지 않았거나 부적절하게 메시지가 전달됩니다. 그래서 : 당신은 무엇을보고 있냐? – egrunin

+0

egrunin은 지적했듯이 좀 더 구체적이어야합니다. 무엇을 스크롤하고 어떻게할까요? 그것은 텍스트입니까? 스크롤 상자를 제어 하시겠습니까? 구식 비트 맵 스크롤링인가요? 어떤 종류의 응용입니까? 경기? –

+2

이 문서는 Petzold의 책에서 다룰 수 있습니다. 많은 Win32 관련 질문이 있습니다. –

답변

1

난 당신이 WM_VSCROLL/WM_HSCROLL 이벤트를 처리하는 방법에 대한 예는 말을 생각합니다. 그렇다면 첫 번째 단계는 해당 이벤트를 처리하는 것입니다. 해당 호출의 HIWORD (wParam) 값을 사용하지 말고 GetScrollInfo, GetScrollPos 및 GetScrollRange 함수를 대신 사용해야합니다.

다음은 MSDN - Using Scroll Bars에 의해 스니핑 된 예제 코드입니다. 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);