Programming/C Win32 MFC2009. 9. 2. 18:09

CEdit 컨트롤의 색상을 변경하기 위해서는 WM_CTLCOLOR을 이용한다.
일단 전역변수로 CBrush COLORREF 변수를 선언해준다.
그리고 나서 클래스 위저드에서 다이얼로그 자체의 WM_CTLCOLOR을 생성해준다.

이 녀석은 그리기 전에 메시지를 가로채서 색상을 설정해주는 역활을 한다고 한다.

OnInitDialog() 에서
    m_redcolor=RGB(255,0,0);                      // red
    m_bluecolor=RGB(0,0,255);                     // blue
    m_textcolor=RGB(255,255,255);                 // white text
    m_redbrush.CreateSolidBrush(m_redcolor);      // red background
    m_bluebrush.CreateSolidBrush(m_bluecolor);    // blue background
이런식으로 브러시와 색상을 미리 설정해준다.

그 다음에, OnCtlColor에서 GetDlgCtrlID()에 의해 분기를 쳐주면서
원하는 컨트롤의 ID에 연결해주면 원하는 색상으로 그려진다.

    pDC->SetBkColor(m_bluecolor);
    pDC->SetTextColor(m_textcolor);
    hbr = (HBRUSH) m_bluebrush;

위의 내용을 사용하면되며,
    SetBKColor()은 배경색상(기본값은 흰색)
    SetTextColor()은 글씨색상(기본값은 검은색)
을 변경해주게 된다.

브러시를 리턴함으로, 이 브러시를 이용하여 실제로 변경한 색상으로 그려주게 된다.


아래는 OnCtlColor의 기본 템플릿이다.
클래스위저드가 생성하면 // TODO 사이의 내용이 없으므로 불편하다.
HBRUSH CBarcodeDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	switch(nCtlColor)
	{
		case CTLCOLOR_EDIT:
		case CTLCOLOR_MSGBOX:
			switch (pWnd->GetDlgCtrlID())
			{
				default:
					break;
			}
			break;

		case CTLCOLOR_STATIC:
			switch (pWnd->GetDlgCtrlID())
			{
				default:
					break;
			}
			break;

		default:
			break;
	}
	
	// TODO: Return a different brush if the default is not desired
	return hbr;
}


[링크 : http://www.codeguru.com/Cpp/controls/editctrl/backgroundcolor/article.php/c3929/#more]
[링크 : http://mind444.tistory.com/64]
Posted by 구차니