switch(nCtlColor) { case CTLCOLOR_STATIC: { pDC->SetTextColor(RGB(255, 0, 0)); pDC->SetBkColor(RGB(0, 255, 0)); } } // TODO: Return a different brush if the default is not desired return hbr;
}
위와 같이 설정하면 모든 스태틱 컨트롤에 영향을 준다. 실행 결과 화면은 다음과 같다.
필요한 컨트롤만 색상을 변경하려면 다음과 같은 추가 작업이 필요하다. 좌측 상단의 첫번째 컨트롤의 속성창을 열어서 아이디를 IDC_STATIC_1 이라고 변경한다. 그리고 다음과 같이 코드를 변경한다.
switch(nCtlColor) { case CTLCOLOR_STATIC: { if(pWnd->GetDlgCtrlID() == IDC_STATIC_1) { pDC->SetTextColor(RGB(255, 0, 0)); pDC->SetBkColor(RGB(0, 255, 0)); } } } // TODO: Return a different brush if the default is not desired return hbr; }
저번에 이어 에디트 컨트롤을 사용하면서 글자색이나 배경색을 바꾸는 것에 대하여 알아보자. 이 기능은 에디트 컨트롤 뿐만 아니라, 거의 모든 문자열 입출력이 있는 컨트롤에 해당하는 기능이므로 잘 알아두면 다른 컨트롤에서도 쉽게 사용할 수 있다.
다이알로그의 이벤트 중에 WM_CTLCOLOR 라는 이벤트가 있습니다.
저걸 추가하고 나면 화면상에 다음과 같은 코드가 자동으로 추가됩니다.
HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: Return a different brush if the default is not desired
return hbr;
}
1. CDC* pDC - MFC에서 제공하는 디바이스 컨텍스트
2. CWnd* pWnd - 대상이 되는 다이알로그에 올려진 컨트롤 윈도우
3. UINT nCtlColor - 대상이 되는 컨트롤의 구분 타입.
3번의 대상이 되는 컨트롤의 구분 타입은 다음과 같습니다.
이는 winuser.h에 선언되어 있구요.
#define CTLCOLOR_MSGBOX 0
#define CTLCOLOR_EDIT 1
#define CTLCOLOR_LISTBOX 2
#define CTLCOLOR_BTN 3
#define CTLCOLOR_DLG 4
#define CTLCOLOR_SCROLLBAR 5
#define CTLCOLOR_STATIC 6
나는 에디트 컨트롤을 대상으로 작업을 하므로 CTLCOLOR_EDIT 를 사용할 것입니다.
그럼 다음과 같은 코드를 추가해 봅니다.
HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
switch(nCtlColor)
{
case CTLCOLOR_EDIT:
{
if(pWnd->GetDlgCtrlID() == IDC_EDIT9)
pDC->SetTextColor(RGB(255, 0, 0));
else if(pWnd->GetDlgCtrlID() == IDC_EDIT14)
pDC->SetBkColor(RGB(0, 255, 0));
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
의미를 해석해보면 IDC_EDIT9번을 가진 에디트 컨트롤의 글자색을 빨간색 RGB(255,0,0))으로
IDC_EDIT14번을 가진 에디트 컨트롤의 글자 배경색을 녹색 RGB(0,255,0)으로 바꿔라 입니다.
여러개를 한꺼번에 바꾸거나, 그런건 머 위의 코드를 약간 수정하면 될테니 그건 손수 한번 해보세요.