본문 바로가기
컴퓨터/MFC_API

Scrollbar message handler 처리하기

by adnoctum 2009. 12. 27.
CDialog-derived 에서뿐만이 아니라, SDI나 MDI에서도 동적으로든 정적으로든 CScrollBar를 쓰게 될 때, scrollbar에서 오는 message를 일일이 작성해 줄 때가 있는데, 다음과 같은 코드가 자주 사용된다.

void CTestView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // scroll 되기 전의 위치를 저장해 놓는다.
    UINT nOldPos = pScrollBar->GetScrollPos();       

    int diff = 0; // scroll 될 정도
    switch(nSBCode){
       
// 왼쪽이 눌리면 예전 값에서 1을 뺀다.
        case SB_LINELEFT: diff = -1; break;

              // PAGE의 경우, 100 을 뺀다. 이 경우,
              //  현재 내가 scroll range를

              // [0, 1000] 으로 해 놓아서, 이 값의 10%인 100 을 설정한 것이다.
              // 대개 [0,100] 으로

              // scroll range를 설정해 놓으면, PAGE의 경우 10 만큼 변환시키곤 한다.
        case SB_PAGELEFT: diff = -100; break;
        case SB_LINERIGHT: diff = 1; break;
        case SB_PAGERIGHT: diff = 100; break;
    }

    UINT nCurrentPos = nOldPos + diff;
       // thumb을 옮기고 있는 중이라면 [nPos] 값이 현재 위치가 된다.
    if(nSBCode == SB_THUMBTRACK){
        nCurrentPos = nPos;
    }

    // thumb의 위치를 새로 옮겨 준다.
    // 델파이나 비베랑은 달리
    // C++ 에서는 이런 거 일일이 다 해줘야 한다는. 
    pScrollBar->SetScrollPos(nCurrentPos);


    // 여기서 각 scrollbar에 적당한 추가 작업을 한다.
    std::map<CScrollBar*,double*>::iterator find_pos;
    find_pos = _scb2value.find(pScrollBar);
    if(find_pos != _scb2value.end()){
        double min_value = _var2min[find_pos->second];
        double max_value = _var2max[find_pos->second];

        double real_value = (nCurrentPos/1000.0)*(max_value - min_value) + min_value;
        *(find_pos->second) = real_value;
        Simulate();
    }
   
    CView::OnHScroll(nSBCode, nCurrentPos, pScrollBar);
}



사용자 삽입 이미지