LISTORY
[MFC] Static Text 배경 색 변경 & 투명화시 글자 겹침 문제 해결 본문
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 ")); }
문구가 겹치지 않고 정상적으로 바뀌는 것을 확인할 수 있습니다.
'IT > MFC' 카테고리의 다른 글
[MFC] CString에서 int, int에서 CString (0) | 2017.06.05 |
---|---|
Visual Studio 2013, MFC, expected numerical dialog constant 에러 (0) | 2017.05.22 |
Comments