[API] ScrollBar

simpled 2013.06.23 15:55 조회 수 : 6139



/*

스크롤바는 지금까지 논한 컨트롤들에 비해서는 비교적 복잡한 컨트롤이다.

 

스크롤바는 scrollbar 윈도우 클래스로 생성하며 수평 스크롤 바일 경우 SBS_HORZ 스타일을, 수직 스크롤 바일 경우는 SBS_VERT 스타일을 지정한다.

스크롤바는 범위와 현재 위치값을 가지는데, 다음 두 함수로 이 값들을 지정한다.

 

BOOL SetScrollRange(HWND, INT, INT, INT, BOOL);

순서는 , 핸들값, 컨트롤 구분값, 최소값, 최대값, 재생성값 이며, 특히 컨트롤 구분값이 Default면 부모윈도우의 스크롤 바를 지칭하게 되므로

통상적으로 child window의 스크롤바를 조작하기 위해서는 SB_CTL이란 키워드를 넣어주어야 한다.

 

int SetScrollPos(HWND, INT, INT, BOOL);

순서는 핸들값, 컨트롤 구분값, 위치값, 재생성값 이며, 마찬가지로 컨트롤 구분값이 SB_CTL이란 키워드를 넣어줘야 한다.

 

스크롤에 대한 wParam 값은 다음과 같다.

LOWORD(wParam) 스크롤 바 내의 어디를 눌렀는가?

HIWORD(wParam) 현재 위치

lParam 스크롤 바의 윈도우 핸들

 

LOWORD(wParam)으로 전달되는 값은 사용자의 스크롤 요구사항을 나타내며 가능한 값의 종류는 다음과 같다.

SB_LINELEFT 사용자가 왼쪽 화살표 버튼을 눌렀다는 뜻이며 이때는 왼쪽으로 한단위 스크롤 시킨다.

  & SB_LINEUP

SB_LINERIGHT 사용자가 오른쪽 화살표 버튼을 눌렀다는 뜻이며 이때는 오른쪽으로 한 단위 스크롤 시킨다.

  & SB_LINEDOWN

SB_PAGELEFT 사용자가 왼쪽 몸통 부분을 눌렀다는 뜻이며 이때는 한 페이지 왼쪽으로 스크롤 시킨다.

  & SB_PAGEUP

SB_PAGERIGHT 사용자가 오른쪽 몸통 부분을 눌렀다는 뜻이며 이때는 한 페이지 오른쪽으로 스크롤시킨다.

  &SB_PAGEDOWN

SB_THUMBPOSITION 스크롤 박스를 드래그한 후 마우스 버튼을 놓았다.

SB_THUMBTRACK 스크롤 박스를 드래그 하고 있는 중이다. 이 베시지는 마우스 버튼을 놓을 때까지 계속 전달된다.

 

이러한 내용을 통해 사각형 내의 색상을 변경시키는 간단한 프로그램을 아래와 같이 제시한다.

*/

 

 

enum {SC_RED=3000, SC_GREEN, SC_BLUE};

 

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

        int wmId, wmEvent;

        PAINTSTRUCT ps;

        HDC hdc;

        HBRUSH MyBrush, OldBrush;

 

        static INT iTemp, iRed, iGreen, iBlue;

 

        switch (message)

        {

        case WM_CREATE:

               iTemp= iRed= iGreen= iBlue= 0;

 

               CreateWindow(TEXT("scrollbar"), NULL,

                       WS_CHILD | WS_VISIBLE | SBS_HORZ,

                       0, 0, 200, 20, hWnd, (HMENU)SC_RED, hInst, NULL);

               CreateWindow(TEXT("scrollbar"), NULL,

                       WS_CHILD | WS_VISIBLE | SBS_HORZ,

                       0, 40, 200, 20, hWnd, (HMENU)SC_GREEN, hInst, NULL);

               CreateWindow(TEXT("scrollbar"), NULL,

                       WS_CHILD | WS_VISIBLE | SBS_HORZ,

                       0, 80, 200, 20, hWnd, (HMENU)SC_BLUE, hInst, NULL);

               for(int iPoint=SC_RED; iPoint<=SC_BLUE; iPoint++)

               {

                       SetScrollRange(GetDlgItem(hWnd, iPoint), SB_CTL, 0, 255, TRUE);

                       SetScrollPos(GetDlgItem(hWnd, iPoint), SB_CTL, 0, TRUE);

               }

               break;

        case WM_HSCROLL:

               if((HWND)lParam==GetDlgItem(hWnd, SC_RED)) iTemp=iRed;

               if((HWND)lParam==GetDlgItem(hWnd, SC_GREEN)) iTemp=iGreen;

               if((HWND)lParam==GetDlgItem(hWnd, SC_BLUE)) iTemp=iBlue;

               switch(LOWORD(wParam))

               {

                       case SB_LINELEFT:

                              iTemp=max(0, iTemp-1);

                              break;

                       case SB_LINERIGHT:

                              iTemp=min(255, iTemp+1);

                              break;

                       case SB_PAGEUP:

                              iTemp=max(0, iTemp-10);

                              break;

                       case SB_PAGEDOWN:

                              iTemp=min(255, iTemp+10);

                              break;

                       case SB_THUMBTRACK:

                              iTemp=HIWORD(wParam);

                              break;

               }

               if((HWND)lParam==GetDlgItem(hWnd, SC_RED)) iRed=iTemp;

               if((HWND)lParam==GetDlgItem(hWnd, SC_GREEN)) iGreen=iTemp;

               if((HWND)lParam==GetDlgItem(hWnd, SC_BLUE)) iBlue=iTemp;

               SetScrollPos((HWND)lParam, SB_CTL, iTemp, TRUE);

               InvalidateRect(hWnd, NULL, FALSE);

               break;

        case WM_COMMAND:

               wmId    = LOWORD(wParam);

               wmEvent = HIWORD(wParam);

               // 메뉴의선택영역을구문분석합니다.

               switch (wmId)

               {

                       case IDM_ABOUT:

                              DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

                              break;

                       case IDM_EXIT:

                              DestroyWindow(hWnd);

                              break;

                       default:

                              return DefWindowProc(hWnd, message, wParam, lParam);

               }

               break;

        case WM_PAINT:

               hdc = BeginPaint(hWnd, &ps);

              

               MyBrush=CreateSolidBrush(RGB(iRed, iGreen, iBlue));

               OldBrush=(HBRUSH)SelectObject(hdc, MyBrush);

               Rectangle(hdc, 0, 120, 200, 220);

               SelectObject(hdc, OldBrush);

               DeleteObject(MyBrush);

              

               EndPaint(hWnd, &ps);

               break;

        case WM_DESTROY:

               PostQuitMessage(0);

               break;

        default:

               return DefWindowProc(hWnd, message, wParam, lParam);

        }

        return 0;

}