WM_CTLCOLORBTN

인수

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

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

설명

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

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

오너 드로우 버튼에 대해서만 이 메시지가 전달되며 BS_PUSHBUTTON, BS_DEFPUSHBUTTON, BS_PUSHLIKE 스타일의 버튼에 대해서는 이 메시지가 전달되지 않는다. 이 메시지를 받으려면 버튼은 반드시 BS_OWNERDRAW 스타일을 가지고 있어야 한다.

이 메시지는 같은 스레드 내에서만 보내진다.

리턴

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

예제

예제 1

다음 예제는 푸쉬 버튼과 오너 드로우 버튼을 만들고 오너 드로우 버튼의 배경 색상과 전경, 배경색을 변경한다.

HWND hBtn1,hBtn2;
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	static HBRUSH hBrush;
    LPDRAWITEMSTRUCT lpdis; 

	switch(iMessage) {
	case WM_CREATE:
		hBtn1=CreateWindow("button","보통 버튼",WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
			20,20,100,25,hWnd,(HMENU)0,g_hInst,NULL);
		hBtn2=CreateWindow("button","",WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
			20,120,100,25,hWnd,(HMENU)1,g_hInst,NULL);
		hBrush=CreateSolidBrush(RGB(0,0,255));
		return 0;
	case WM_CTLCOLORBTN:
		SetTextColor((HDC)wParam,RGB(0,255,0));
		SetBkColor((HDC)wParam,RGB(0,0,255));
		return (LRESULT)hBrush;
    case WM_DRAWITEM: 
        lpdis = (LPDRAWITEMSTRUCT)lParam;
        if (lpdis->itemState & ODS_SELECTED) {
			TextOut(lpdis->hDC,2,2,"선택됨",6);
		} else {
			TextOut(lpdis->hDC,2,2,"안선택",6);
		}
        return 0; 
	case WM_COMMAND:
		switch(LOWORD(wParam)) {
		case 0:
			MessageBox(hWnd,"보통 버튼을 눌렀습니다.","알림",MB_OK);
			break;
		case 1:
			MessageBox(hWnd,"오너 드로우 버튼을 눌렀습니다.","알림",MB_OK);
			break;
		}
		return 0;
	case WM_PAINT:
		hdc=BeginPaint(hWnd, &ps);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		DeleteObject(hBrush);
		PostQuitMessage(0);
		return 0;
	}
	return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

실행중의 모습은 다음과 같다. 오너 드로우 버튼도 선택하면 WM_COMMAND 메시지를 보낸다.

플랫폼

95이상

참조

 


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