아래 그림을 보면 배경을 다양한 형태로 처리할 수 있음을 알수 있다.
사실상 저렇게 쓰는 경우는 별반 없지만... UI 작업을 하다보면
어떤 정신 세계가 독특한 커스터머나 디자이너를 만날지 모른다..
화면을 보면 무엇을 설명하고자 하는지 쉽게 이해할 수 있을 것이다.
스태틱 컨트롤의 배경 전체 색상을 바꾸어 주기위해서는 저 영역을 먼가로 칠해주어야한다.
MFC에서 먼가 영역을 칠할 때 필요한 객체는 CGdiObject를 상속받은 놈 중에 CBrush 라고 하는
일종의 빗자루? 붓? 비끄무리한 객체가 있다.
우선 헤더에 CBrush m_brush; 라고 객체를 하나 선언한다.
BOOL CSssDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 브러쉬 객체를 녹색으로 생성한다.
m_brush.CreateSolidBrush(RGB(0, 255, 0));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
그리고, 지금까지와 마찬가지로.. WM_CTLCOLOR 이벤트 핸들러를 추가한후
다음과 같이 코드를 수정한다.
HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
switch(nCtlColor)
{
case CTLCOLOR_STATIC:
{
pDC->SetTextColor(RGB(255, 0, 0));
if(pWnd->GetDlgCtrlID() == IDC_STATIC_1)
pDC->SetBkColor(RGB(0, 255, 0));
else if(pWnd->GetDlgCtrlID() == IDC_STATIC_3)
// 앙? 그냥 브러쉬를 리턴하면 끝이냐?
// 그렇다 그냥은 디폴트 브러쉬가 날라가게 되는데..
// 여기에 먼가 특별한 브러쉬를 만들어 리턴하면 그게 그 컨트롤의
// 배경에 영향을 미치게 된다.
// 다양한 브러쉬를 만들어 리턴해보자 ^^;
return m_brush;
else if(pWnd->GetDlgCtrlID() == IDC_STATIC_2)
{
pDC->SetBkColor(RGB(0, 255, 0));
return m_brush;
}
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
---------------------------------------------------------------------------------
이 부분을 진행하다 보니, 만약 패턴 브러쉬를 넣었을 경우는 어떻게 될까? 라는
생각이 들어서 별도로 진행해 보았다.
이 그림은 위의 소스 일부를 수정하여, 변경해 본 것으로.. Hatch 브러쉬를 이용하여
배경을 칠해본것이다. 자? 두번째를 어떻게 처리할 수 있을까?
BOOL CSssDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_brush.CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 0));
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
switch(nCtlColor)
{
case CTLCOLOR_STATIC:
{
pDC->SetTextColor(RGB(255, 0, 0));
if(pWnd->GetDlgCtrlID() == IDC_STATIC_1)
pDC->SetBkColor(RGB(0, 255, 0));
else if(pWnd->GetDlgCtrlID() == IDC_STATIC_3)
return m_brush;
else if(pWnd->GetDlgCtrlID() == IDC_STATIC_2)
{
// ???
// 한번 직접 구현해 보자.
// 결과물은 아래의 첨부파일에 포함되어 있다.
}
}
}
// TODO: Return a different brush if the default is not desired
return hbr;
}