/*
스크롤바는 지금까지 논한 컨트롤들에 비해서는 비교적 복잡한 컨트롤이다.
스크롤바는 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;
}
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | [API] 기초 코드 | simpled | 2013.06.23 | 9417 |
67 | [MFC] 한글 파일 입출력 | simpled | 2013.06.24 | 9006 |
66 | [MFC] 한글 파일 출력 | simpled | 2013.06.24 | 6985 |
65 |
[API] 발표 자료
![]() | simpled | 2013.06.23 | 6423 |
64 |
[API] Drag&Drop2
![]() | simpled | 2013.06.23 | 6350 |
63 |
[API] 기말 과제
![]() | simpled | 2013.06.23 | 6894 |
62 | [API] 프로젝트 경로 리턴 함수 (비공개) | simpled | 2013.06.23 | 6672 |
61 | [API] 파일 조작 관련된 좋은 함수들 | simpled | 2013.06.23 | 6385 |
60 |
[API] Drag&Drop
![]() | simpled | 2013.06.23 | 6623 |
59 |
[API] 로딩 화면(팝업(popup)) 완성 - 2
![]() | simpled | 2013.06.23 | 5918 |
58 |
[API] 로딩 화면(팝업(popup)) 완성 - 1
![]() | simpled | 2013.06.23 | 5934 |
57 |
[API] 로딩 화면(팝업(popup)) 기획
![]() | simpled | 2013.06.23 | 6244 |
56 |
[API] 제목 표시줄 없애기
![]() | simpled | 2013.06.23 | 6445 |
55 | [API] Alt+F4 막기 | simpled | 2013.06.23 | 7139 |
54 |
[API] Project : SimplePaint v4.0
![]() | simpled | 2013.06.23 | 6064 |
53 |
[API] Project : SimplePaint v1.0
![]() | simpled | 2013.06.23 | 6578 |
52 |
[API] DialogBox
![]() | simpled | 2013.06.23 | 6775 |
51 | [API] Static | simpled | 2013.06.23 | 6204 |
» | [API] ScrollBar | simpled | 2013.06.23 | 6171 |
49 |
[API] ComboBox
![]() | simpled | 2013.06.23 | 6654 |
48 |
[API] ListBox
![]() | simpled | 2013.06.23 | 7184 |