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 | 모든 버튼을 허가 |
'프로그래밍(Programming) > MFC&API' 카테고리의 다른 글
MFC 리본 스타일2, 뷰 포인트 얻기 (0) | 2012.11.01 |
---|---|
기존 MFC 프로젝트에 Ribbon UI 적용하기 (0) | 2012.11.01 |
[원본] 유용한 클래스 - 텍스트가 스크롤되는 Static 컨트롤 (0) | 2012.11.01 |
MFC 강의 -4 컨트롤 다루기 - 버튼 (0) | 2012.11.01 |
Slider control(슬라이드바 컨트롤) (0) | 2012.11.01 |