TODAY : / TOTAL :

120705_API :: 스크롤바(Scroll Bar)

  • Share this:
반응형

 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));
}


반응형

SEARCH

태그로 찾아보기