JHB의 프로그래밍 삽질기

[MFC] 그림의 아래에 가로로 스크롤바를 달았을 경우 적당한 ScrollBar의 Size 본문

PROGRAMMING/Win/MFC

[MFC] 그림의 아래에 가로로 스크롤바를 달았을 경우 적당한 ScrollBar의 Size

roter 2011.08.11 15:27




그림을 넣고 그 아래에 가로로 스크롤바를 달아서 그림을 좌우로 스크롤 되게 할 경우
적당한 스크롤바의 인포는 다음과 같이 설정한다.

int nScrollBarSize = m_nSize - DISPLAY_WIDTH + m_nSize/10; //스크롤바의 크기 때문에 이렇게 조금 빼줘야 한다.

nScrollBarSize = nScrollBarSize>0?nScrollBarSize:0;

SCROLLINFO si;
si.fMask = SIF_ALL;
si.nMax = nScrollBarSize;
si.nMin = 0;
si.nPage = m_nSize/10;
si.nTrackPos = 0;
si.nPos = 0;
m_scrollTime.SetScrollInfo(&si);


여기서 DISPLAY_WIDTH는 그림이 표시되는 실제 영역의 가로 크기이다.
m_nSize는 그림의 가로 크기이다.

예를 들어 그림 크기가 1000px이고, 이를 400px짜리 화면에 출력하려면
DISPLAY_WIDTH는 400이고 m_nSize는 1000인 것이다.
위 식처럼 해 줄 경우, 스크롤바 사이즈와 그림 스크롤 영역의 움직임이 딱 매칭된다.

OnHScroll은 아래와 같은 식으로 해주면 됨.

void CDlgXXXXXX::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
 if( pScrollBar )
 {
  if( pScrollBar == (CScrollBar*)&m_scrollTime )
  {
   SCROLLINFO si;

   if( pScrollBar->GetScrollInfo(&si) )
   {
    switch(nSBCode)
    {
    case SB_PAGELEFT:
     si.nPos -= si.nPage;
     break;
    case SB_PAGERIGHT:
     si.nPos += si.nPage;
     break;
    case SB_LINELEFT:
     si.nPos -= si.nPage/10;
     break;
    case SB_LINERIGHT:
     si.nPos += si.nPage/10;
     break;
    case SB_THUMBPOSITION:
    case SB_THUMBTRACK:
     si.nPos = si.nTrackPos;
     break;
    }
    m_nPos = si.nPos;
    pScrollBar->SetScrollPos(si.nPos);
    //그래프를 다시 그린다.
    InvalidateGraph();
   }
  }
 }
 CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}

나중에 필요할 때 그대로 배껴쓰자~
1 Comments
댓글쓰기 폼