WM_HSCROLL

인수

LOWORD(wParam) : 사용자의 스크롤 요구를 전달하며 스크롤 바의 눌러진 위치값이 전달된다. 다음 값 중 하나가 전달된다.

설명
SB_RIGHT 제일 오른쪽으로 스크롤되었다. 키보드의 END키가 눌러지면 이 메시지가 전달된다.
SB_ENDSCROLL 스크롤이 종료되었다.
SB_LINERIGHT 사용자가 오른쪽 화살표를 눌렀다.
SB_LINELEFT 사용자가 왼쪽 화살표를 눌렀다.
SB_PAGERIGHT 사용자가 오른쪽 몸통을 눌렀다.
SB_PAGELEFT 사용자가 왼쪽 몸통을 눌렀다.
SB_THUMBPOSITION 사용자가 썸을 드래그한 후 마우스를 놓았다. 변경된 스크롤 값에 맞게 화면을 다시 그려주어야 한다.
SB_THUMBTRACK 사용자가 썸을 드래그하고 있다. 변경된 스크롤 값에 맞게 화면을 다시 그려주어야 한다.
SB_LEFT 제일 왼쪽으로 스크롤되었다. 키보드의 HOME키가 눌러지면 이 메시지가 전달된다.

스크롤 바의 눌러진 위치에 따른 스크롤 코드는 다음 그림과 같다.

HIWORD(wParam) : SB_THUMBPOSITION, SB_THUMBTRACK 메시지의 경우 스크롤 바의 현재 위치가 전달된다. 다른 메시지에서는 사용되지 않는다. 이 값은 16비트이나 스크롤 바는 32비트 범위를 스크롤 할 수 있는데 32비트의 스크롤 값을 얻고 싶을 경우 이 인수를 직접 사용하는 대신 GetScrollInfo 함수로 값을 직접 조사해 사용해야 한다. 만약 스크롤 범위가 음수를 가질 수 있다면 이 값을 int형으로 캐스팅한 후 읽어야 한다.

lParam : 스크롤 바 컨트롤로부터 이 메시지가 전달되었을 경우 스크롤 바 컨트롤의 윈도우 핸들이 전달된다. 표준 스크롤 바인 경우 이 인수는 NULL이다.

설명

윈도우의 아래쪽에 부착되는 표준 수평 스크롤 바, 또는 SBS_HORZ 스타일을 가지는 수평 스크롤 바 컨트롤이 부모 윈도우로 스크롤 메시지를 보낼 때 이 메시지가 전달된다. 다른 컨트롤은 자신의 변화를 WM_COMMAND로 전달하지만 스크롤 바는 WM_COMMAND 대신 WM_HSCROLL, WM_VSCROLL 메시지를 보낸다. 또한 이 메시지는 트랙 바 컨트롤에 의해 사용되기도 한다.

윈도우는 이 메시지를 받았을 때 스크롤 바의 위치를 갱신해 주어야 하며 화면 스크롤 처리(또는 내부적인 값의 변경)를 해 주어야 한다. 사용자가 썸을 직접 드래그할 때 SB_THUMBTRACK 메시지가 발생하며 드래그를 종료할 때 SB_THUMBPOSITION 메시지가 발생하는데 이 두 메시지 중 하나만 처리해 주면 되며 둘 다 처리할 필요는 없다. 이때 HIWORD(wParam)으로 전달되는 값은 16비트 범위이므로 65535이상의 스크롤 위치값은 전달되지 않으므로 GetScrollInfo 함수로 직접 위치를 구해야 한다.

리턴

이 메시지를 처리했으면 0을 리턴해야 한다.

예제

예제 1

다음 예제는 세 개의 수평 스크롤 바를 사용하여 임의의 색상값을 입력받는 가장 전형적인 스크롤 바 예제이다.

#define ID_SCRRED 100
#define ID_SCRGREEN 101
#define ID_SCRBLUE 102
HWND hRed,hGreen,hBlue;
int Red,Green,Blue;

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("scrollbar",NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
			10,10,256,20,hWnd,(HMENU)ID_SCRRED,g_hInst,NULL);
		hGreen=CreateWindow("scrollbar",NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
			10,40,256,20,hWnd,(HMENU)ID_SCRGREEN,g_hInst,NULL);
		hBlue=CreateWindow("scrollbar",NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
			10,70,256,20,hWnd,(HMENU)ID_SCRBLUE,g_hInst,NULL);
		SetScrollRange(hRed,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;
	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,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,266,200);
		SelectObject(hdc,OldBrush);
		DeleteObject(MyBrush);
		EndPaint(hWnd,&ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

세 개의 수평 스크롤 바 컨트롤을 만들었으며 각 컨트롤이 보내는 WM_HSCROLL 메시지에서 R,G,B색상 요소값을 변경하여 이 색상으로 사각형을 그려준다.

예제 2

다음 예제는 수평 트랙바로 0~100까지의 값을 입력받는 예제이다. 트랙바도 스크롤 바와 마찬가지로 별도의 통지 메시지 대신 WM_HSCROLL 메시지를 보내며 스크롤 바와 동일한 방법으로 처리한다.

#include <commctrl.h>
HWND hTrack;
int Pos;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	PAINTSTRUCT ps;
	HDC hdc;
	char str[128];

	switch(iMessage) {
	case WM_CREATE:
		InitCommonControls();
		hTrack=CreateWindow(TRACKBAR_CLASS,NULL,WS_CHILD | WS_VISIBLE ,
			10,100,300,40,hWnd,NULL,g_hInst,NULL);
		SendMessage(hTrack, TBM_SETRANGE, FALSE, MAKELPARAM(0,100));
		return 0;
	case WM_HSCROLL:
		if ((HWND)lParam == hTrack) {
			Pos=SendMessage(hTrack, TBM_GETPOS,0,0);
			InvalidateRect(hWnd, NULL, TRUE);
		}
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		wsprintf(str, "%d", Pos);
		SetBkMode(hdc,TRANSPARENT);
		TextOut(hdc,150,50,str,strlen(str));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

실행 결과는 다음과 같다. 트랙 바는 스크롤 바와 사용 용도가 거의 동일하되 좀 더 많은 스타일을 가지고 있고 몇가지 추가 기능을 가지고 있다는 점이 다르다.

플랫폼

95이상

참조

 


written by http://www.winapi.co.kr