WM_CTLCOLORSCROLLBAR

인수

wParam : 스크롤 바의 DC핸들. 이 DC에 전경색과 배경색 등을 설정한다.

lParam : 스크롤 바의 핸들. 한 윈도우에 여러 개의 스크롤 바가 있을 경우 이 핸들값으로 원하는 스크롤 바만 색상을 변경할 수 있다.

설명

시스템이 스크롤 바를 그리기 전에 이 메시지를 보내 배경색상으로 사용할 브러시 핸들을 질문한다. DefWindowProc은 시스템에 정의된 컨트롤 색상을 리턴하도록 되어 있으므로 이 메시지를 처리하지 않으면 디폴트 색상으로 스크를 바가 그려진다. 부모 윈도우가 이 메시지를 직접 처리하여 배경 브러시 핸들을 리턴하면 스크롤 바의 배경 색상을 변경할 수 있다. wParam으로 DC의 핸들이 전달되므로 전경색과 배경색을 변경할 수는 있지만 스크롤 바는 텍스트를 출력하지 않기 때문에 배경 브러시를 바꾸는 것 외에는 별다른 의미가 없다.

배경 브러시를 변경하고자 할 경우 WM_CREATE 등의 메시지에서 미리 브러시를 만들어 놓고 이 메시지에서 브러시 핸들을 리턴해 주면 된다. 시스템은 이 메시지에서 리턴한 브러시 핸들로 스크롤 바의 몸체를 그린다. 이 브러시는 시스템이 자동으로 파괴해 주지 않으므로 더 이상 필요가 없어졌을 때(WM_DESTROY) 부모 윈도우가 직접 파괴해 주어야 한다.

이 메시지는 스크롤 바 컨트롤에게만 보내지며 WM_HSCROLL, WS_VSCROLL 스타일에 의해 윈도우에 부착된 표준 스크롤 바에는 보내지지 않는다. 이 메시지는 같은 스레드 내에서만 보내진다.

리턴

이 메시지를 처리했으면 배경 브러시의 핸들을 리턴해 준다. 브러시 핸들값은 LRESULT로 캐스팅된 후 리턴되어야 한다. 부모 윈도우가 대화상자라면 BOOL형으로 캐스팅해야 한다.

예제

예제 1

다음 예제는 스크롤 세 개로 색상을 선택하는 전형적인 스크롤 바 예제이다. 각 스크롤 바의 몸체 색상을 조정할 색상으로 출력하도록 하였다.

#define ID_SCRRED 100
#define ID_SCRGREEN 101
#define ID_SCRBLUE 102
HWND hRed,hGreen,hBlue;
int Red,Green,Blue;
HBRUSH hbR,hbG,hbB;
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,200,20,hWnd,(HMENU)ID_SCRRED,g_hInst,NULL);
		hGreen=CreateWindow("scrollbar",NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
			10,40,200,20,hWnd,(HMENU)ID_SCRGREEN,g_hInst,NULL);
		hBlue=CreateWindow("scrollbar",NULL,WS_CHILD | WS_VISIBLE | SBS_HORZ,
			10,70,200,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);
		hbR=CreateSolidBrush(RGB(255,0,0));
		hbG=CreateSolidBrush(RGB(0,255,0));
		hbB=CreateSolidBrush(RGB(0,0,255));
		return 0;
	case WM_CTLCOLORSCROLLBAR:
		if ((HWND)lParam==hRed)
			return (LRESULT)hbR;
		if ((HWND)lParam==hGreen)
			return (LRESULT)hbG;
		if ((HWND)lParam==hBlue)
			return (LRESULT)hbB;
		break;
	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,210,200);
		SelectObject(hdc,OldBrush);
		DeleteObject(MyBrush);
		EndPaint(hWnd,&ps);
		return 0;
	case WM_DESTROY:
		DeleteObject(hbR);
		DeleteObject(hbG);
		DeleteObject(hbB);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WM_CREATE에서 미리 세 개의 브러시를 생성해 두었으며 WM_CTLCOLORSCROLLBAR 메시지를 받았을 때 스크롤 바의 핸들과 비교하여 적절한 색상의 브러시를 리턴해 주었다. WM_DESTROY에서 브러시는 해제해 주어야 한다. 실행중의 모습은 다음과 같다.

플랫폼

95이상

참조

 


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