반응형

http://cafe.naver.com/opendori.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=25355

 

=================================================================================================

 

http://cafe.naver.com/cyberzone/401





스크롤바는 윈도우의 문서의 스크롤을 도와주는 컨트롤이다. 각 부분은 다음과 같은 명칭을 갖는다.

최근에는 스크롤바에의한 스크롤보다는 마우스 휠에의한 스크롤이 더 편리하게 여겨지고 있다.

스크롤바의 생성

스크롤 바는 두가지 방법으로 만들 수 있다. 첫 번째 방법은 window class에 WS_HSCROLL, WS_VSCROLL 스타일을 주어서 만드는 것이고, 둘째 방법은 CreateWindow 함수로 "scrollbar"라는 이미 등록되어 있는 WNDCLASS를 찍어내어 만든다.

스크롤바는 다음과 같은 스타일을 가질 수 있다.

스타일

설명

SBS_HORZ

수평 스크롤바

SBS_VERT

수직 스크롤바

SBS_BOTTOMALIGN

크기가 크더라도 일정한 크기로 아래에 붙여버림

SBS_TOPALIGN

크기가 크더라도 일정한 크기로 위에 붙여버림

SBS_LEFTALIGN

크기가 크더라도 일정한 크기로 왼쪽에 붙여버림

SBS_RIGHTALIGN

크기가 크더라도 일정한 크기로 오른쪽에 붙여버림

스크롤바의 메시지

스크롤 바 혹은 스크롤 윈도우는 WM_HSCROLL, WM_VSCROLL 메시지를 받는다. 각 경우 모두 동일하게 처리되며 인자들은 다음과 같다.

인수

설명

LOWORD(wParam)

스크롤 코드

HIWORD(wParam)

썸의 위치값이다. 이 값은 사용자가 썸을 드랙할 때만 세팅된다.

lParam

스크롤 바의 HWND, 표준 스크롤 바일 경우는 NULL

이들 메시지 처리 방법은 스크롤 코드인 LOWORD(wParam)을 기준으로 다음과 같이 한다.

스크롤 코드

처리 방법

SB_LINEUP

사용자가 위쪽 arrow를 눌렀다. 한 줄 위로 올려준다.

SB_LINEDOWN

사용자가 아래쪽 arrow를 눌렀다. 한 줄 아래로 내려준다.

SB_PAGEUP

사용자가 위쪽 shaft를 눌렀다. 한 페이지 위로 올려준다.

SB_PAGEDOWN

사용자가 아래쪽 shaft를 눌렀다. 한 페이지 아래로 내려준다.

SB_ENDSCROLL

스크롤이 종료되었다.

SB_TOP

제일 위쪽으로 스크롤 되었다.

SB_BOTTOM

제일 아래쪽으로 스크롤 되었다.

SB_THUMBTRACK

사용자가 썸을 드랙하고 있다. 변경된 스크롤 값에 맞게 되면을 다시 그린다.

SB_THUMBPOSITION

사용자가 썸을 드랙한 후 마우스를 놓았다. 변경된 스크롤 값에 맞게 화면을 다시 그린다.

제일 아래 두 코드는 상호 대체성이 있기 때문에 둘 중의 하나만 달아주면 된다.

만일 키보드를 지원하고 싶다면 아래 코드를 추가하라.

case WM_KEYDOWN:
	switch(wParam)
	{
	case VK_UP: SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_LINEUP, 0), 0); break;
	case VK_DOWN: SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_LINEDOWN, 0), 0); break;
	case VK_PRIOR: SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEUP, 0), 0); break;
	case VK_NEXT: SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_PAGEDOWN, 0), 0); break;
	case VK_HOME: SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_TOP, 0), 0); break;
	case VK_END: SendMessage(hwnd, WM_VSCROLL, MAKELONG(SB_BOTTOM, 0), 0); break;
	}

스크롤바 관련 함수

  • BOOL SetScrollRange(HWND hwnd, int bar, int min, int max, BOOL redraw)

스크롤바의 범위는 표준 스크롤바의 경우는 0~100, 스크롤바 컨트롤의 경우에는 0~0이다. 이 값은 SetScrollRange 함수로 변경할 수 있다.

첫 번째 인자가 윈도우의 핸들일 경우 bar에는 SB_HORZ나 SB_VERT가 와야 한다. 첫 번째 인자가 스크롤바 컨트롤일 경우에는 SB_CTL이 와야한다.

만일 min==max이면 스크롤바는 숨겨진다.

스크롤바의 범위를 세팅할 때는 한가지 주의해야 할 점이 있다. 문서의 height와 같게 range를 설정하면 안된다는 것이다. 그 경우에는 현재 화면의 가장 위가 0이고 마지막 화면의 가장 위가 height가될 때 까지 스크롤 되므로, 맨 마지막에 한 화면 만큼의 빈 공간이 들어가게 된다.

  • BOOL GetScrollRange(HWND hwnd, int bar, LPINT lpmin, LPINT lpmax)

이 함수의 첫 번째 두 개의 인자는 위의 SetScrollRange와 같다. 나머지 두 인자는 정수값을 얻어올 주소이다.

  • int SetScrollPos(HWND hwnd, int bar, int pos, BOOL redraw)

이 함수는 스크롤바의 현재 위치를 세팅해 준다. 기존값이 리턴된다.

  • int GetScrollPos(HWND hwnd, int bar)

스크롤바의 현재 위치를 얻어온다.

다음은 Win32에서 추가된 스크롤바 함수들이다.

  • int SetScrollInfo(HWND hwnd, int bar, LPSCROLLINFO lpsi, BOOL redraw)

이 함수는 위의 많은 일들을 한번에 처리하는 함수이다. 세 번째 인자는 다음 구조체로 설정한다.

typedef struct tag SCROLLINFO
{
	UINT cbSize;
	UINT fMask;
	int nMin;
	int nMax;
	UINT nPage;
	int nPos;
	int nTrackPos;
} SCROLLINFO;
typedef SCROLLINFO FAR* LPSCROLLINFO;

cbSize에는 sizeof(SCROLLINFO)를 대입해 주면 된다.

fMask에는 설정할 값을 지정한다. 다음 값들중의 하나이다.

설명

SIF_DISABLENOSCROLL

범위가 0이 되더라도 스크롤바를 숨기지 않고 사용 금지 시킨다.

SIF_PAGE

nPage로 페이지의 크기를 정한다.

SIF_POS

nPos값으로 위치를 정한다.

SIF_RANGE

nMin, nMax값으로 range를 설정한다.

SIF_ALL

모든 플래그의 조합

nPage에 관한 것이 새로 추가된 것으로 썸의 크기를 결정하는데 사용하는 한 페이지의 크기를 말한다.

SetScrollInfo 함수는 nTrackPos를 사용하지 않는다.

  • BOOL GetScrollInfo(HWND hwnd, int bar, LPSCROLLINFO lpsi)

스크롤바에 관한 모든 정보를 한번에 얻어온다. nTrackPos 맴버는 SB_THUMBTRACK 메시지에서 드래그 중의 썸의 위치를 넘긴다.

  • BOOL ShowScrollBar(HWND hwnd, int bar, BOOL show)

이 함수는 스크롤바를 보이거나 보이지 않게 한다.

  • BOOL EnableScrollBar(HWND hwnd, int bar, UINT arrow)

이 함수는 스크롤바를 보이거나 보이지 않게 한다. arrow에는 다음 값들이 올 수 있다.

arrow 값

설명

ESB_DISABLE_BOTH

모든 버튼을 금지

ESB_DISABLE_DOWN

아래쪽 버튼을 금지

ESB_DISABLE_LEFT

왼쪽 버튼을 금지

ESB_DISABLE_LTUP

왼쪽, 위 버튼을 금지

ESB_DISABLE_RIGHT

오른쪽 버튼을 금지

ESB_DISABLE_RTDN

오른쪽, 아래쪽 버튼을 금지

ESB_DISABLE_UP

위쪽 버튼을 금지

ESB_ENABLE_BOTH

모든 버튼을 허가

반응형

+ Recent posts