LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
HBRUSH MyBrush, OldBrush;
int TempPos;
switch (iMessage) {
case WM_CREATE:
hRed=CreateWindow(TEXT("scrollbar"),NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
10,10,400,20,hWnd,(HMENU)ID_SCRRED,g_hInst,NULL);
hGreen=CreateWindow(TEXT("scrollbar"),NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
10,40,400,20,hWnd,(HMENU)ID_SCRGREEN,g_hInst,NULL);
hBlue=CreateWindow(TEXT("scrollbar"),NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
10,70,400,20,hWnd,(HMENU)ID_SCRBLUE,g_hInst,NULL);
// 스크롤바 범위(막대기가 가지는 데이터 값 :: 0~255 까지)
SetScrollRange(hRed, // 스크롤바 핸들
SB_CTL, // SB_CTL = 윈도우 기본 스크롤바 모양 사용.
0, // 스크롤바 시작 값.
255, // 스크롤바 마지막 값.
TRUE); // 다시그리기 여부
// 초기 스크롤바 막대 위치.
SetScrollPos(hRed,SB_CTL,0,TRUE);
SetScrollRange(hGreen,SB_CTL,0,255,TRUE);
SetScrollPos(hGreen,SB_CTL,0,TRUE);
SetScrollRange(hBlue,SB_CTL,0,255,TRUE);
SetScrollPos(hBlue,SB_CTL,0,TRUE);
return 0;
// 스크롤바는 COMMAND 메시지가 아닌 전용 메시지를 따로 받음.
// (부가적으로 받는 데이터가 많이 필요해서...)
case WM_HSCROLL:
if ((HWND)lParam == hRed) TempPos = Red;
if ((HWND)lParam == hGreen) TempPos = Green;
if ((HWND)lParam == hBlue) TempPos = Blue;
switch (LOWORD(wParam)) {
case SB_LINELEFT: // 스크롤바 왼쪽 끝 화살표 버튼을 누를 때
TempPos=max(0,TempPos-1);
break;
case SB_LINERIGHT: // 스크롤바 오른쪽 끝 화살표 버튼을 누를 때
TempPos=min(255,TempPos+1);
break;
case SB_PAGELEFT: // 스크롤바 왼쪽 화살표와 기준점 사이 면을 눌렀을 때
TempPos=max(0,TempPos-10);
break;
case SB_PAGERIGHT: // 스크롤바 오른쪽 화살표와 기준점 사이 면을 눌렀을 때
TempPos=min(255,TempPos+10);
break;
case SB_THUMBTRACK: // 드래그 해서 옮길 때 (막대의 위치값 바로 전달)
TempPos=HIWORD(wParam);
break;
}
if ((HWND)lParam == hRed) Red=TempPos;
if ((HWND)lParam == hGreen) Green=TempPos;
if ((HWND)lParam == hBlue) Blue=TempPos;
SetScrollPos((HWND)lParam, // 이동한 자리로 막대 이동. ( 위의 switch문 안의 내용은 수치만 변경될뿐 보이는 막대의 위치변경을 설정한 것은 아님. )
SB_CTL,
TempPos,
TRUE);
InvalidateRect(hWnd,NULL,FALSE); // 막대가 이동할 때마다 다시그리기.
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
MyBrush=CreateSolidBrush(RGB(Red,Green,Blue));
OldBrush=(HBRUSH)SelectObject(hdc,MyBrush);
Rectangle(hdc,10,100,410,300);
SelectObject(hdc,OldBrush);
DeleteObject(MyBrush);
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
|