LISTORY

[MFC] Static Text 배경 색 변경 & 투명화시 글자 겹침 문제 해결 본문

IT/MFC

[MFC] Static Text 배경 색 변경 & 투명화시 글자 겹침 문제 해결

LiStoryTeller 2017. 5. 31. 09:52

1. Static Text Control  배경 색 변경


MFC의 control 배경 색을 변경하기 위해선 OnCtlColor 함수를 이용해야 합니다.


배경색을 바꾸기 원하는 컨트롤이 위치하는 Dialog로 이동하여 


오른쪽 마우스 클릭, 클래스 마법사를 열어줍니다.




메시지에 들어가 WM_CTLCOLOR를 검색하여 처리기에 추가해줍니다.


그럼 자동으로 해당 클래스 코드에 OnCtlColor 코드가 추가된 것을 확인할 수 있습니다.


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

	// TODO:  여기서 DC의 특성을 변경합니다.

	// TODO:  기본값이 적당하지 않으면 다른 브러시를 반환합니다.
	return hbr;
}


<현재 다이얼로그를 실행한 모습>



이제 Static Control의 배경 color를 변경하겠습니다.


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

	if (nCtlColor == CTLCOLOR_STATIC)
	{
		pDC->SetBkColor(RGB(255, 0, 0)); 
	}

	return hbr;
}


OnCtlColor에서 컨트롤의 배경 색을 변경할 때엔 


어떤 컨트롤이냐에 따라 배경색을 변경해 줄 수 있습니다.


위의 코드는 control이 Static Control일 경우 배경색을 red로 변경하라는 코드입니다.





static control만 배경색이 red로 변경되었고 나머지 control의 배경색은 변경되지 않은 것을 확인할 수 있습니다.



이제는 Static Text에 써진 색 대로 배경 색을 바꿔보겠습니다.


이를 위해선 컨트롤의 ID를 사용해야 합니다.


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

	UINT nID = pWnd->GetDlgCtrlID();

	switch (nID)
	{
	case IDC_STATIC_RED:
		pDC->SetBkColor(RGB(255, 0, 0));
		hbr = ::CreateSolidBrush(RGB(255, 0, 0));
		break;
	case IDC_STATIC_BLUE:
		pDC->SetBkColor(RGB(0, 0, 255));
		hbr = ::CreateSolidBrush(RGB(0, 0, 255));
		break;
	case IDC_STATIC_TRANS:
		pDC->SetBkMode(TRANSPARENT);
		hbr = (HBRUSH)GetStockObject(NULL_BRUSH);;
		break;
	}

	return hbr;
}







2. 배경을 투명하게 한 Static Text 글자 겹침 문제



위의 예제에서 버튼을 누르면 Static Transparent의 문구를 바꾸도록 수정하였습니다.


void TestDlg::OnBnClickedButton()
{
	GetDlgItem(IDC_STATIC_TRANS)->SetWindowTextW(_T("Text Change "));
}





버튼을 누르면 다음과 같이 문구가 겹치는 것을 볼 수 있습니다.


이를 해결하기 위해 코드를 다음과 같이 고쳐줍니다.


void TestDlg::OnBnClickedButton()
void TestDlg::OnBnClickedButton()
{
	CRect rect;
	GetDlgItem(IDC_STATIC_TRANS)->GetWindowRect(&rect);
	ScreenToClient(&rect);
	InvalidateRect(rect);

	GetDlgItem(IDC_STATIC_TRANS)->SetWindowTextW(_T("Text Change "));
}




문구가 겹치지 않고 정상적으로 바뀌는 것을 확인할 수 있습니다.






Comments