WM_CTLCOLORSTATIC

인수

wParam : 스태틱 컨트롤의 DC핸들. 이 DC에 전경색과 배경색 등을 설정한다.

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

설명

시스템이 스태틱 컨트롤을 그리기 전에 이 메시지를 보내 배경색상과 전경색 배경색 등을 질문한다. DefWindowProc은 시스템에 정의된 컨트롤 색상을 리턴하도록 되어 있으므로 이 메시지를 처리하지 않으면 디폴트 색상으로 스태틱이 그려진다. 부모 윈도우가 이 메시지를 직접 처리하면 wParam으로 전달되는 DC에 전경색과 배경색을 설정할 수 있으며 배경 브러시 핸들을 리턴함으로써 스태틱의 배경 색상을 변경할 수 있다.

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

읽기 전용 스타일을 가진 에디트 컨트롤과 사용 금지된 에디트도 이 메시지를 대신 받는다. 이 메시지는 같은 스레드 내에서만 보내진다.

리턴

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

예제

예제 1

다음 예제는 두 개의 스태틱 컨트롤을 생성하고 그 중 하나를 파란색 배경에 흰색으로 출력하도록 색상을 변경한다.

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static HBRUSH hBrush;
	static HWND hS1,hS2;
	TCHAR Mes[]="스태틱 컨트롤의 색상을 변경합니다";

	switch(iMessage) {
	case WM_CREATE:
		hS1=CreateWindow("static","부모 윈도우가 설정한 색상",WS_CHILD | WS_VISIBLE,
			10,50,300,25,hWnd,(HMENU)0,g_hInst,NULL);
		hS2=CreateWindow("static","운영체제 디폴트 색상",WS_CHILD | WS_VISIBLE,
			10,100,300,25,hWnd,(HMENU)1,g_hInst,NULL);
		hBrush=CreateSolidBrush(RGB(0,0,255));
		return 0;
	case WM_CTLCOLORSTATIC:
		if ((HWND)lParam==hS1) {
			SetTextColor((HDC)wParam,RGB(255,255,255));
			SetBkColor((HDC)wParam,RGB(0,0,255));
			return (LRESULT)hBrush;
		}
		break;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		TextOut(hdc,10,10,Mes,lstrlen(Mes));
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		DeleteObject(hBrush);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

WM_CREATE에서 미리 브러시를 생성해 놓았으며 WM_CTLCOLORSTATIC에서 이 핸들을 리턴해 주었다. 단, 이 예제의 경우 한 윈도우에 두 개의 스태틱이 있으므로 원하는 스태틱의 색상만 변경하기 위해 lParam으로 전달되는 윈도우 핸들을 비교하였다. WM_DESTROY에서는 브러시를 파괴해 주어야 한다.

플랫폼

95이상

참조

 


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