Windows/MFC
SCROLLINFO
aucd29
2013. 10. 2. 18:25
typedef struct tagSCROLLINFO {
UINT cbSize;
UINT fMask;
int nMin;
int nMax;
UINT nPage;
int nPos;
int nTrackPos;
} SCROLLINFO, *LPSCROLLINFO;
typedef SCROLLINFO CONST *LPCSCROLLINFO;
스크롤 바의 범위와 위치 등의 속성값을 가진다
▶cbSize : 이 구조체의 크기를 지정한다.
▶fMask : 읽거나 설정하고자 하는 값을 지정하는 플래그이며 다음 플래그들의 조합을 지정한다. 이 플래그 상태에 따라 구조체의 어떤 멤버를 사용할 것인가가 결정된다.
플래그 설명
SIF_ALL
SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS의 조합이며 모든 속성값을 한꺼번에 조사하거나 설정하고자 할 때 이 플래그를 대신 사용한다.
SIF_DISABLENOSCROLL
쓰기 전용의 플래그이다. 스크롤 바에 새로 설정되는 속성값이 스크롤 바를 사용할 필요가 없는 상태라면, 예를 들어 스크롤 범위가 페이지 크기보다 작다거나 할 경우 스크롤 바를 숨기는 대신 사용금지 상태로 보이도록 한다.
SIF_PAGE
nPage 멤버에 값을 설정하거나 읽는다.
SIF_POS
nPos 멤버에 값을 설정하거나 읽는다.
SIF_RANGE nMin, nMax 멤버에 값을 설정하거나 읽는다.
SIF_TRACKPOS nTrackPos 멤버에 값을 설정하거나 읽는다.
▶nMin, nMax : 스크롤 바의 최소, 최대값
▶nPage : 스크롤 바의 페이지 크기. 이 값에 의해 스크롤 바는 비례 스크롤 바가 되며 썸의 크기를 결정한다.
▶nPos : 스크롤 바의 현재 위치
▶nTrackPos : 사용자가 썸을 드래그하고 있는 중의 임시적인 위치. 주로 SM_THUMBTRACK 메시지를 처리하는동안 트래킹 위치를 얻기 위해 이 멤버를 사용한다. 이 멤버는 읽기 전용이며 이 값을 변경하는 것은 무의미하다.
여기서 살펴보면 나머지 다른 속성들은 직관적으로 이해할 수 있는 범위의 설명이다.
그런데 nPage라는 도대체 어떤 놈일까???
이전 예제를 이용하여 알아보도록 하자.
다음 그림은 기본적인 값이 이전 예제와 동일하고 page값이 디폴트로 0인 샘플이다.
가운데 이동 막대기(Thumb)의 크기는 기본값이다.
아래의 그림은 다음과 같은 코드를 추가하여 page를 전체 범위의 1/2인 50으로 준 샘플이다
그림이 조금 달라보이지 않는가? 저 페이지라고 하는 개념은 워드나 아래한글에서...
말하는 문서 전체의 페이지와 비슷한 개념이다.
위에 2번째 그림으로 스크롤바 정보를 예측해보면.. 아마도 현재 보이는 스크롤바의 2배 정도
화면 크기가 아닐까.. 즉 0-100 사이이니까.. 현재 화면에 보이는 크기가 50정도..
만약 page를 20으로 설정한다면 스크롤바크기의 1/5가 되고.. 대략 시각적으로 보면
화면 기준으로 전체 다섯페이지 정도가 되겠구나 라고.. 예측할 수 있다.
즉, 전체 범위의 크기와 현재 화면상에 보여지는 스크롤바의 크기의 비율을 적당해 계산해서..
화면이 리사이징될 때마다 다시 계산해서 넣어주면...
화면의 크기와 스크롤바의 이동막대기 크기를 보고 대략 유추할 수 있게 된다.
이것이 스크롤바의 page값의 의미이다.
아래의 코드는 스크롤바의 페이지값을 재설정하는 코드이다.
SCROLLINFO info = {sizeof(SCROLLINFO), SIF_PAGE, 0};
info.nPage = 50;
m_scroll.SetScrollInfo(&info);
UINT cbSize;
UINT fMask;
int nMin;
int nMax;
UINT nPage;
int nPos;
int nTrackPos;
} SCROLLINFO, *LPSCROLLINFO;
typedef SCROLLINFO CONST *LPCSCROLLINFO;
스크롤 바의 범위와 위치 등의 속성값을 가진다
▶cbSize : 이 구조체의 크기를 지정한다.
▶fMask : 읽거나 설정하고자 하는 값을 지정하는 플래그이며 다음 플래그들의 조합을 지정한다. 이 플래그 상태에 따라 구조체의 어떤 멤버를 사용할 것인가가 결정된다.
플래그 설명
SIF_ALL
SIF_PAGE | SIF_POS | SIF_RANGE | SIF_TRACKPOS의 조합이며 모든 속성값을 한꺼번에 조사하거나 설정하고자 할 때 이 플래그를 대신 사용한다.
SIF_DISABLENOSCROLL
쓰기 전용의 플래그이다. 스크롤 바에 새로 설정되는 속성값이 스크롤 바를 사용할 필요가 없는 상태라면, 예를 들어 스크롤 범위가 페이지 크기보다 작다거나 할 경우 스크롤 바를 숨기는 대신 사용금지 상태로 보이도록 한다.
SIF_PAGE
nPage 멤버에 값을 설정하거나 읽는다.
SIF_POS
nPos 멤버에 값을 설정하거나 읽는다.
SIF_RANGE nMin, nMax 멤버에 값을 설정하거나 읽는다.
SIF_TRACKPOS nTrackPos 멤버에 값을 설정하거나 읽는다.
▶nMin, nMax : 스크롤 바의 최소, 최대값
▶nPage : 스크롤 바의 페이지 크기. 이 값에 의해 스크롤 바는 비례 스크롤 바가 되며 썸의 크기를 결정한다.
▶nPos : 스크롤 바의 현재 위치
▶nTrackPos : 사용자가 썸을 드래그하고 있는 중의 임시적인 위치. 주로 SM_THUMBTRACK 메시지를 처리하는동안 트래킹 위치를 얻기 위해 이 멤버를 사용한다. 이 멤버는 읽기 전용이며 이 값을 변경하는 것은 무의미하다.
여기서 살펴보면 나머지 다른 속성들은 직관적으로 이해할 수 있는 범위의 설명이다.
그런데 nPage라는 도대체 어떤 놈일까???
이전 예제를 이용하여 알아보도록 하자.
다음 그림은 기본적인 값이 이전 예제와 동일하고 page값이 디폴트로 0인 샘플이다.
가운데 이동 막대기(Thumb)의 크기는 기본값이다.
아래의 그림은 다음과 같은 코드를 추가하여 page를 전체 범위의 1/2인 50으로 준 샘플이다
그림이 조금 달라보이지 않는가? 저 페이지라고 하는 개념은 워드나 아래한글에서...
말하는 문서 전체의 페이지와 비슷한 개념이다.
위에 2번째 그림으로 스크롤바 정보를 예측해보면.. 아마도 현재 보이는 스크롤바의 2배 정도
화면 크기가 아닐까.. 즉 0-100 사이이니까.. 현재 화면에 보이는 크기가 50정도..
만약 page를 20으로 설정한다면 스크롤바크기의 1/5가 되고.. 대략 시각적으로 보면
화면 기준으로 전체 다섯페이지 정도가 되겠구나 라고.. 예측할 수 있다.
즉, 전체 범위의 크기와 현재 화면상에 보여지는 스크롤바의 크기의 비율을 적당해 계산해서..
화면이 리사이징될 때마다 다시 계산해서 넣어주면...
화면의 크기와 스크롤바의 이동막대기 크기를 보고 대략 유추할 수 있게 된다.
이것이 스크롤바의 page값의 의미이다.
아래의 코드는 스크롤바의 페이지값을 재설정하는 코드이다.
SCROLLINFO info = {sizeof(SCROLLINFO), SIF_PAGE, 0};
info.nPage = 50;
m_scroll.SetScrollInfo(&info);