티스토리 뷰

Visual Studio 2012

 

컨트롤의 배경색을 변경하거나 투명하게 만들어보자.

 

1. Ctrl + Shift + X 키를 눌러 클래스 마법사를 실행한다.

 

2. 배경화면을 바꿀 대화상자의 클래스 이름을 지정한 후, 메시지 탭의 WM_CTLCOLOR 의 처리기를 추가한다.

 

3. 추가 후 생성된 함수에는 아래와 같이 코드를 삽입한다.

HBRUSH 클래스이름::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
	
	if(nCtlColor == CTLCOLOR_STATIC)	//STATIC 컨트롤만 배경색 변경
		pDC->SetBkColor(RGB(255, 255, 255));	//배경색 변경
	else	//그 외의 컨트롤은 배경을 투명하게
		pDC->SetBkMode(TRANSPARENT);		//배경 투명하게
	hbr = (HBRUSH)GetStockObject(NULL_BRUSH);
	return hbr;
}

위의 코드에서 사용된 함수

1. SetBkColor(): 배경색을 변경한다. RGB(255,255,255) 부분을 원하는 색상에 맞게 변경하면 된다.

2. SetBkMode(): 배경색을 투명하게 한다. TRANSPARENT 를 입력하게 되면 투명하게 설정된다.

 

nCtlColor는 컨트롤별 컬러 타입을 가지고 있으며

그 중 CTLCOLOR_STATIC을 활용하면 STATIC 컨트롤만 활용할 수 있다.

 

예제에서는 STATIC 컨트롤만 하얀색으로 변경하고

그 외의 컨트롤들은 배경을 투명하게 변경하여 대화상자의 색에 맞추고자 했다.

 

번외

SetBkMode(TRANSPARENT) 사용 시

 1) 에디트 컨트롤을 SetDlgItemText() 활용해서 초기화 하면 기존에 입력했던 내용이 배경으로 남아있는 현상 발견됨.

 2) 콤보박스(드롭리스트)에서 리스트 다운 클릭시 리스트 배경이 이상하게 변경되는 현상 발견됨.

이를 해결하기 위해 아래와 같이 변경함

HBRUSH CDlgScan::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	CBrush brh;
	HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);

	brh.CreateSolidBrush(RGB(255,255,255));
	
	if((nCtlColor == CTLCOLOR_STATIC) || (nCtlColor == CTLCOLOR_EDIT))
		pDC->SetBkColor(RGB(255, 255, 255));	//배경색 변경
	else if(nCtlColor == CTLCOLOR_LISTBOX)
	{
		pDC->SetBkColor(RGB(255, 255, 255));	//배경색 변경
		return brh;
	}
	else
	{
		if(nCtlColor == CTLCOLOR_BTN)
			pDC->SetBkMode(TRANSPARENT);		//배경 투명하게
	}
	hbr = (HBRUSH)GetStockObject(NULL_BRUSH);
	return hbr;
}

처음 코드와 대조된 내용 검토하면 된다.

콤보박스의 드롭리스트는 CTLCOLOR_LISTBOX를 활용하며 CBrush를 새로 만들어서

CreateSolidBrush()를 활용하여 그 변수를 리턴해줘야 제대로 표시된다.

 

 

 

 

댓글