티스토리 뷰

컴퓨팅/프로그래밍

스크롤바

에어버스 2024. 2. 14. 20:35

윈도우즈API정복 18.스크롤바 정리

- 표준 스크롤바 
윈도우의 오른쪽과 아래쪽에 밀착되어 나타나며 작업영역이 데이터를 한번에 전부 보여주기 어려울때 문서를 스크롤하기 위한 용도로 사용한다.
윈도우 클래스에 WS_HSCROLL, WS_VSCROLL 스타일을 지정하면 스크롤바가 만들어진다.
표준 스크롤바는 소속 윈도우에 부착되어 있는 그래픽 컨트롤일 뿐 차일드 컨트롤이 아니며 작업영역에서도 제외된다.

- 스크롤바 컨트롤
CreateWindow 로 만들어지는 독립된 윈도우이며 scrollbar 윈도우 클래스로 만든다.
표준 스크롤바와 달리 윈도우이므로 별도의 핸들을 가진다. 특별한 용도가 정해져있지 않으며 값을 입력받는 일반적인 용도로 사용할 수 있다.

스크롤바는 3가지 요소로 구성한다.
1. 화살표 버튼
2. 썸 (Thumb)
3. 바(Bar)

스타일
SBS_HORZ 수평 스크롤바
SBS_VERT 수직 스크롤바
SBS_BOTTOMALIGN
SBS_TOPALIGN
SBS_LEFTALIGN
SBS_RIGHTALIGN
이중 SBS_HORZ, SBS_VERT 만 사용하고 나머지는 거의 사용안된다.

메시지
WM_HSCROLL, WM_VSCROLL 메시지를 부모 윈도우에게 보낸다.
LOWORD(wParam) - 스크롤 코드, 사용자가 스크롤 바의 어디를 눌렀는지 알린다.
HIWORD(wParam) - 썸 위치 값, 이 값을 썸을 드래그할때만 전달된다.
lParam - 스크롤바의 윈도우 핸들이되 표준 스크롤바인 경우 NULL 이다.

스크롤 코드
SB_THUMBTRACK - 사용자가 썸을 드래그 하는 중에 연속적으로 보내지며, 변경된 스크롤 값에 맞게 화면을 다시 그려주어야 한다.
SB_THUMBPOSITION - 사용자가 썸을 드래그가 끝나는 시점에서 한 번만 보낸다.
이 두 메시지 중 반드시 하나는 처리해야 하며, 두 메시지를 무시하면 사용자가 썸을 조작할때 아무런 반응이 없게된다.
메모장이나 편집기는 이 들 메시지를 처리하고, 캐드, 지도와 같이 복잡한 출력인 경우 속도 문제로 SB_THUMBPOSITION만 처리하지만 사용자 입장에서는 불편할 수 있다. 

스크롤 범위
스크롤 바가 가질 수 있는 가장 작은 값인 최소값과 가장 큰 값인 최대값의 차가 바로 범위이다.
범위는 스크롤바의 용도에 따라 달라지는데 색상 값을 입력 받는 스크롤 바라면 0~255까지고
백분율인 경우 0~100까지의 범위를 가질 것이다.
작업 영역을 스크롤하는 표준 스크롤 바는 작업 영역의 크기 만큼의 스크롤 범위를 가진다.
스크롤 바의 기본 범위는 표준 스크롤 바일 경우 0~100까지 이며 스크롤 바 컨트롤일 경우는 0~0까지이다. 즉, 스크롤 바컨트롤은 기본값으로 주어지는 범위가 아예 없다. 그래서 스크롤 바를 만든 직후에 용도에 맞게 범위를 지정해야 한다.
스크롤 바의 범위를 지정하는 함수와 범위를 얻는 함수는 
BOOL SetScrollRange(HWND hWnd, int nBar, int MinPos, nMaxPos, BOOL bRedraw)
BOOL GetScrollRange( HWND hWnd, int nBar, LPINT lpMinPos , LPINT lpMaxPos)

nBar
SB_CTL - 스크롤 바 컨트롤, hWnd는 범위 지정 대상 스크롤 바의 윈도우 핸들 (컨트롤 자신의 핸들)
SB_HORZ - 수평 표준 스크롤 바, hWnd는 스크롤 바를 가진 윈도우의 핸들 (부모 윈도우의 핸들)
SB_VERT - 수직 표준 스크롤 바, hWnd는 스크롤 바를 가진 윈도우의 핸들 (부모 윈도우의 핸들)

스크롤 바의 최소값과 최대값이 같으면 스크롤 바는 숨겨진다.
bRedraw는 범위 변경 후 스크롤 바를 다시 그릴지 지정하며, 스크롤 바를 만든 직후에 초기 범위를 지정할때는 다시 그릴 필요가 없지만 실행 중에 범위가 변경되면 다시 그려야 썸의 위치가 범위에 맞게 재조정된다.

int SetScrollPos(HWND hWnd, int nBar, int nPos, BOOL bRedraw)
int GetScrollPos(HWND hWnd, int nBar)

nPos - 스크롤 바의 새 위치를 지정하며, 범위 안의 값이어야 한다. 만약, 최소값 보다 작으면, 최소값, 최대값보다 크면 최대값으로 강제로 조정된다.

위 함수는 16비트 윈도우즈부터 사용한 함수이다.

스크롤 범위는 최대값으로 하면 마지막까지 스크롤 하면 빈 화면이 나오므로 화면 크기만큼 빼서 최대값으로하면 끝까지 스크롤 하더라도 화면에 데이타가 보여진다.
만약, 100개의 데이타가 있을때 화면에 10개만 나오면 100-10=90 을 최대값으로 한다.

표준 스크롤 바는 포커스를 가질 수 없으므로 키보드로 직접 조작이 안되므로 WM_KEYDOWN 메시지를 받아 VK_UP, VK_DOWN, VK_RIGHT, VK_LEFT 처리해줘야 한다.

비례 스크롤 바

썸의 크기로 데이타의 길이와 현재 위치를 함께 표시하는 스크롤 바
Win32 부터 적용

int SetScrollInfo(HWND hWnd, int fnBar, LPSCROLLINFO lpsi, BOOL fRedraw)
BOOL GetScrollInfo(HWNd hWnd, int fnBar, LPSCROLLINFO lpsi)

스크롤 바의 범위, 위치뿐만 아니라 스크롤 바가 표시할 화면 영역의 크기까지 지정하여 비례 스크롤 바를 만든다.

1
2
3
4
5
6
7
8
9
10
11
ypedef struct tagSCROLLINFO
{
    UINT    cbSize;
    UINT    fMask;
    int     nMin;
    int     nMax;
    UINT    nPage;
    int     nPos;
    int     nTrackPos;
}   SCROLLINFO, FAR *LPSCROLLINFO;
typedef SCROLLINFO CONST FAR *LPCSCROLLINFO;
cs

 

cbSize - 구조체의 크기이며 버전 확인용으로 sizeof(SCROLLINFO) 를 대입하면 된다.
fMask - 설정할 값과 옵션을 지정한다.
SIF_DISABLENOSCROLL - 범위가 0 이 되더라도 스크롤 바를 숨기지 않고 사용 금지시킨다.


 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30