WM_VSCROLL

인수

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

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

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

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

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

설명

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

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

리턴

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

예제

예제 1

다음 예제는 수직 스크롤 바 컨트롤로부터 0~100까지의 값을 입력받는다. 스크롤 바를 드래그하거나 클릭할 때마다 WM_VSCROLL 메시지를 받아 Value 전역 변수값을 변경한다.

#define ID_SCROLL 100
HWND hScroll;
int Value;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	char str[128];
	switch(iMessage) {
	case WM_CREATE:
		hScroll=CreateWindow("scrollbar",NULL,WS_CHILD | WS_VISIBLE | SBS_VERT,
			10,10,20,120,hWnd,(HMENU)ID_SCROLL,g_hInst,NULL);
		Value=50;
		SetScrollRange(hScroll,SB_CTL,0,100,TRUE);
		SetScrollPos(hScroll,SB_CTL,Value,TRUE);
		return 0;
	case WM_VSCROLL:
		switch (LOWORD(wParam)) {
		case SB_LINEUP:
			Value=max(0,Value-1);
			break;
		case SB_LINEDOWN:
			Value=min(100,Value+1);
			break;
		case SB_PAGEUP:
			Value=max(0,Value-10);
			break;
		case SB_PAGEDOWN:
			Value=min(100,Value+10);
			break;
		case SB_THUMBTRACK:
			Value=HIWORD(wParam);
			break;
		}
		SetScrollPos((HWND)lParam,SB_CTL,Value,TRUE);
		InvalidateRect(hWnd,NULL,TRUE);
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		wsprintf(str,"Value is %d",Value);
		TextOut(hdc,50,50,str,strlen(str));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

스크롤 바 컨트롤이 하나밖에 없으므로 핸들(lParam)은 비교하지 않았다. 이 예제에서는 SB_THUMBTRACK메시지를 처리하고 있으므로 드래그 중에 곧바로 값이 갱신된다. 만약 드래그 종료후에 값을 갱신하려면 SB_THUMBPOSITION 메시지를 대신 처리하면 된다.

플랫폼

95이상

참조

 


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