본문 바로가기

Library/Windows Programming

WM_CTLCOLOR 메세지로 컨트롤의 배경색 바꾸기

컨트롤의 색을 바꾸는데는 WM_CTLCOLOR 메세지를 이용하게 된다. MFC를 사용하는 경우라면, 미리 정해진 OnCtlColor() 메서드를 사용하게 된다. 그러나, 여기서 주의할 점이 하나 있다. 배경색을 지정하기 위해서 OnCtlColor()의 인자인 pDC를 사용하여 pDC->SetBkColor()로 아무리 지정해봤자 컨트롤의 배경색을 변경되지 않는다는 점인데, 메서드 내부에서 로컬 변수로 브러시를 생성해서 브러시 핸들을 리턴해도 컨트롤의 배경색은 변경되지 않는다. Win32 API에서 인자로 전달되거나 리턴값으로 넘어가는 값이 함수가 종료된 다음에도 계속 유효해야 하는 함수들이 종종 있다.

즉, OnCtlColor의 경우에는, 메세지를 받은 부모가 유효한 브러시 핸들을 계속 가지고 있어야 하며, 그냥 데이터 멤버로 가지고 있는게 가장 무난하다.

코드를 보면 다음과 같다.


...
if(pWnd->GetDlgCtrlID() == ID_CONTROL)
{
    .. pDC를 시용한 작업..
    hbr = m_pControlBrush; // m_pControlBrush는 원하는 값으로 이미 설정되어 있어야 한다.
    /* 즉, m_pControlBrush가 이 코드 블럭 내에서 선언된, 스택에 생성되는 자동변수라면 원하는 효과를
    내지 못한다. */
}

return hbr;