리스트 박스의 글자색과 배경색은 기존에 해온대로 WM_CTLCOLOR 이벤트를
이용하면 아주 쉽게 해결됩니다..

HBRUSH CSssDlg::OnCtlColor(CDCpDCCWndpWndUINT nCtlColor)
{
    
HBRUSH hbr = CDialog::OnCtlColor(pDCpWndnCtlColor);

    
if(nCtlColor == CTLCOLOR_LISTBOX)
    {
        
if(pWnd->GetDlgCtrlID() == IDC_LIST1)
        {
            
pDC->SetTextColor(RGB(25500));
            
pDC->SetBkColor(RGB(255,255,0));

            
// 노랑색으로 만든 브러쉬. - m_brh.CreateSolidBrush(RGB(255,255,0));
            
return m_brh;
        }
    }
    
return hbr;
}

88.zip
0.03MB


지금까지 다룬 방식으로 아주 쉽게 처리가 되었읍니다. -_-
강좌라고 할만한 껀덕지도 없읍니다.

하지만 컨트롤을 오버라이딩해서 별도로 구현하지 않는이상.. 리스트박스는 별로
다룰만한게 없다보니.. 휴~~

이전에 이어 콤보박스가 여러개 있을 때, 각각의 콤보 색상을 어떻게 다르게 처리할 수 있는지에
대하여 진행해 보겠습니다.

우선 다이알로그에 콤보1, 콤보2 이렇게 2개를 올려놓고 진행합니다.
먼저 에디트 색상부터 변경해 보겠습니다.

[드롭다운 스타일의 콤보박스 2개를 준비합니다.]

HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    
if(nCtlColor == CTLCOLOR_EDIT )
    {
        
if(pWnd->GetDlgCtrlID() == 1001)
        {
            
// 부모 윈도우가 NULL 이면 리턴한다.
            
if(pWnd->GetParent() == NULL)
                
return hbr;

            
// 부모 윈도우의 컨트롤 아이디를 구한다.
            
// 아이디가 아래와 같으면 에디트의 색상을 변경시키다.
            
switch(pWnd->GetParent()->GetDlgCtrlID())
            {
            
case IDC_COMBO1:
                
pDC->SetTextColor(RGB(0,255, 0));
                
pDC->SetBkColor(RGB(255, 0, 0));
                
break;
            
case IDC_COMBO2:
                
pDC->SetTextColor(RGB(0,0, 255));
                
pDC->SetBkColor(RGB(255, 255, 0));
                
break;
            }
        }
    }

    
return hbr;
}

결과화면...

위의 코드에서 보았듯이 콤보박스의 에디트는 부모윈도우가 콤보박스입니다.
그렇다면 리스트의 색상을 변경해 보도록 하죠...

HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    
if(nCtlColor == CTLCOLOR_LISTBOX )
    {
        
if(pWnd->GetDlgCtrlID() == 1000)
        {
            
// 현재 포커스가 있는 윈도우를 구한다.
            
pWnd = pWnd->GetFocus();
            
if(pWnd && pWnd->GetParent())
            {
                
// 심플이나 드롭다운일 경우는 에디트에 포커스가 있으므로
                
// 페어런트의 컨트롤 아이디를 구한다페어런트가 콤보박스이다.
                
switch(pWnd->GetParent()->GetDlgCtrlID())
                {
                
case IDC_COMBO1:
                    
pDC->SetTextColor(RGB(0,255, 0));
                    
pDC->SetBkColor(RGB(255, 0, 0));
                    
return brh;
                
case IDC_COMBO2:
                    
pDC->SetTextColor(RGB(255,255, 0));
                    
pDC->SetBkColor(RGB(255, 0, 0));
                    
return brh;
                }
            }
        }
    }

    
return hbr;
}

실행화면


예상했던것과는 코드가 좀 다르죠?
에디트의 페어런트는 콤보박스이지만, 리스트의 페어런트는 콤보박스가 아니고...
템퍼러리 윈도우가 됩니다.
저 리스트박스가 뜨는 원리는 흡사 메뉴가 뜨는것과 비슷한 형식으로 구동되는것 같은데
내부 로직이야 알 수가 없으니.. -_-;;;

리스트가 나올려면 에디트를 꾹 눌러야 나오니까..
현재 포커스가 당연히 있을 테고, 그 포커스가 있는 에디트를 기준으로..
콤보박스의 아이디를 구한겁니다.

이렇게 드롭다운 스타일일 경우는 에디트를 기준으로 콤보박스의 아이디를 구했는데..
드롭리스트 스타일은 에디트가 아니라 스태틱 컨트롤이라고 이전 장에서 알려드렸습니다.
그래서 드롭 리스트 스타일일 경우는 저 방법으로 처리가 불가능해집니다.

그럼 드롭다운 콤보와 드롭리스트 콤보를 2개 놓고 색상을 처리해 보도록 하겠습니다.

[콤보2를 드롭리스트 스타일로 변경합니다.]

HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    
if(nCtlColor == CTLCOLOR_LISTBOX )
    {
        
if(pWnd->GetDlgCtrlID() == 1000)
        {
            
// 현재 포커스가 있는 윈도우를 구한다.
            
pWnd = pWnd->GetFocus();
            
if(pWnd && pWnd->GetParent())
            {
                
// 심플이나 드롭다운일 경우는 에디트에 포커스가 있으므로
                
// 페어런트의 컨트롤 아이디를 구한다페어런트가 콤보박스이다.
                
switch(pWnd->GetParent()->GetDlgCtrlID())
                {
                
case IDC_COMBO1:
                    
pDC->SetTextColor(RGB(0,255, 0));
                    
pDC->SetBkColor(RGB(255, 0, 0));
                    
return brh;
                
case IDC_COMBO2:
                    
pDC->SetTextColor(RGB(255,255, 0));
                    
pDC->SetBkColor(RGB(255, 0, 0));
                    
return brh;
                }
            }
        }
    }

    
return hbr;
}

이로써 콤보박스가 여러개 또는 여러가지 스타일로 섞여 있더라도 개별적으로 찾아서
원하는 색상과 배경을 넣어 줄 수 있게 되었습니다.

콤보의 색상을 처리하면서 느꼇던 점은.. ( 사실 콤보 색상변경은 저도 이번에 첨 해본겁니다. )
윈도우는 어떻게든 부모, 자식, 형제를 찾다보면 모두 거미줄 처럼 이어져 있기 때문에..
언젠가는 원하는 것을 찾을 수 있다는 점이었습니다.

자, 뒤바뀐 순서를 다시 복귀 시켜서 다음에는 콤보에 데이터를 추가하고, 삭제하고 하는 등의
기본적인 용법에 대하여 다루어 보겠습니다.

95.zip
0.15MB

이전에는 콤보박스의 프로퍼티에 대하여 살펴보았다.

이번에는 기본적인 사용법에 대하여 알아보고자 하였지만 필요성에 의하여
글자 색상  배경 색상을 변경하는 것을 먼저 다루고자한다.

콤보박스의 글자와 배경색을 바꾸는  강좌를 진행하면서, 다른 사이트에 올라온 자료들은
어떻게 색상을 변경하였는지를 살펴보았는데, 아쉽게도 만족할 만한 자료를 찾지 못하였다.

 살펴보아야 할것이 콤보박스는 두개의 컨트롤 조합으로 구성되어 있다는 것이다.

심플 / 드롭다운 스타일 경우
콤보박스 == 에디트 컨트롤 + 리스트 박스

드롭 리스트 스타일 경우
콤보박스 == 스태틱 컨트롤(에디트를 가장한) + 리스트 박스

얼핏보면 이상하지만 기능을 생각해보면 이상할 것도 없다.
[
 그렇다면 콤보를 이해하면 리스트 박스도 색상을 바꾸는데 문제 없겠군 ^^;]


우선 콤보박스가 하나라고 생각하고 색상을 먼저 바꾸어보자..
---------------------------------------------------------------------------
헤더에 CBrush m_brush  하나 선언한다.

소스는 다음과 같다.
BOOL CSssDlg::OnInitDialog()
{
    
CDialog::OnInitDialog();
    
brh.CreateSolidBrush(RGB(255, 0, 0));
    
return TRUE;
}

HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    
// 콤보박스는 2개의 컨트롤로 구성되어 있으므로 각각에 대하여 색상을 변경해 주어야 한다.
    
if(nCtlColor == CTLCOLOR_EDIT )
    {
        
pDC->SetTextColor(RGB(0,255, 0));
        
pDC->SetBkColor(RGB(255, 0, 0));
    }
    
else if(nCtlColor == CTLCOLOR_LISTBOX )
    {
        
pDC->SetTextColor(RGB(0,255, 0));
        
pDC->SetBkColor(RGB(255, 0, 0));
        
return brh;
    }

    
return hbr;
}

수행된 화면은 아래와 같다.

우선 주의할 점이 에디트의 글자 색상을 변경할 경우 컨트롤 아이디를 특별하게 구분하지
않았기 때문에.. 좌측의 에디트 컨트롤도 영향을 받았다.

그렇다면 코드를 아래와 같이 바꾸면 콤보박스의 에디트만 색상을 바꿀  있는가?
HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    
if(nCtlColor == CTLCOLOR_EDIT )
    {
        
if(pWnd->GetDlgCtrlID() == IDC_COMBO1)
        {
            
pDC->SetTextColor(RGB(0,255, 0));
            
pDC->SetBkColor(RGB(255, 0, 0));
        }
    }
    
else if(nCtlColor == CTLCOLOR_LISTBOX )
    {
        
pDC->SetTextColor(RGB(0,255, 0));
        
pDC->SetBkColor(RGB(255, 0, 0));
        
return brh;
    }

    
return hbr;
}

기대했던 결과와는 다르게 다음과 같은 그림이 나온다.

그렇다면 콤보박스의 에디트 부분은 별도의 컨트롤 아이디를 가진다는 말인가????

심플 / 드롭다운 스타일 경우
콤보박스(1033) == 에디트 컨트롤 (1001) + 리스트 박스 (1000)

드롭 리스트 스타일 경우
콤보박스(1033)  == 스태틱 컨트롤 (1033) + 리스트 박스 (1000)

위에서 아이디 1000 1001  어디서 나온놈일까?
해당 콤보박스가 에디트와 리스트로 조합되어있다는 이야기를 이전에 하였을 것이다.
이는 MFC 내부 시스템 리소스를 사용하여 구성되었고 각각의 아이디가 위와 같은 것이다.

그러므로 사용자가 작성한 다이알로그의 컨트롤 중에 1000 이나, 1001  있고
 두개의 컨트롤이 각각 에디트와 리스트라면 구분이 용이하지 않게 된다.

우선 다음과 같이 코드를 수정해 보자.
HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    
if(nCtlColor == CTLCOLOR_EDIT )
    {
        
if(pWnd->GetDlgCtrlID() == 1001)
        {
            
pDC->SetTextColor(RGB(0,255, 0));
            
pDC->SetBkColor(RGB(255, 0, 0));
        }
    }
    
else if(nCtlColor == CTLCOLOR_LISTBOX )
    {
        
if(pWnd->GetDlgCtrlID() == 1000)
        {
            
pDC->SetTextColor(RGB(0,255, 0));
            
pDC->SetBkColor(RGB(255, 0, 0));
            
return brh;
        }
    }

    
return hbr;
}

원하는 결과 화면이 나왔다.

콤보박스가 하나일 경우는 이러한 방법으로 원하는 결과를 가져오는데 전혀 문제가 없다.
단, 콤보박스가 여러개일 경우 각각의 색상을 모두 다르게 처리하려면 몇가지 난관이 남게된다..

이것은 다음장에서 다루어 보자..

68.zip
0.15MB

 

에디트에 대한 기초강좌를 마무리한 시점에서 질문이 하나 들어왔다..
지금까지의 내용을 기초로 에디트의 전체 배경을 바꾸었는데.. 깜빡이거나 먼가 이상하다...??

지난 강좌를 찾아보니, 에디트에 대한 배경 처리가 제대로 마무리 되지 못한 상태에서
강좌를 마쳐 혼란을 가져온것일 수 있을꺼 같아..
질문을 토대로 배경처리 기능을 마무리 하려고 한다.

위 그림은 두가지로 그 기능이 분류된다.

1. 왼쪽 에디트
-> 글자 바탕과 배경색상을 모두 녹색으로 처리한 것
2. 오른쪽 에디트
-> 글자 바탕은 TRANSPARENT 시키고, 바탕에는 HATCH 브러쉬를 뿌린것이다.

위 두가지 구현에는 다음과 같은 차이가 있다.
1번은 글자와 배경을 모두 그려주므로, 글씨를 쓸때 잔상이 남거나 깜빡임이 전혀없다.
2번은 글자는 쓰되 배경을 그려주지 않으므로 글씨를 쓸때 깜빡임은 없으나 잔상이 남는다.
이러한 이유로 두가지의 구현 부분에 조금 차이를 가지게 된다.

기본적인 코드는 브러쉬를 2개 만든다는 점만 빼고는 헤더에 추가할 내용은 없다.
BOOL CSssDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 솔리드, 해치 브러쉬를 각각만든다.
    m_brush1.CreateSolidBrush(RGB(0, 255, 0));
    m_brush2.CreateHatchBrush(HS_DIAGCROSS, RGB(0, 255, 0));

    return TRUE;
}

// 클래스 위저드에서 WM_CTLCOLOR 이벤트 핸들러를 추가한다.
HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

    switch (nCtlColor)
    {
    case CTLCOLOR_EDIT:
        pDC->SetTextColor(RGB(255, 0, 0));
        if (pWnd->GetDlgCtrlID() == IDC_EDIT1)
        {
            // 글자 바탕을 녹색으로 하고, 녹색 솔리드 브러쉬를 리턴한다.
            // 이게 전부다.
            pDC->SetBkColor(RGB(0, 255, 0));
            return m_brush1;
        }
        else if (pWnd->GetDlgCtrlID() == IDC_EDIT2)
        {
            // 글자의 배경을 그려주게 되면 바탕의 해치브러쉬 영역에 글자뒷 부분은
            // 녹색 사각형이 그려지게 된다.
            // 이를 막아주기 위하여, 배경그리는 기능을 제거한다. TRANSPARENT
            pDC->SetBkMode(TRANSPARENT);

            // 에디트 컨트롤 영역을 구한 후에
            // 브러쉬로 색칠해준다.
            CRect rc;
            GetDlgItem(IDC_EDIT2)->GetWindowRect(rc);
            ScreenToClient(rc);
            pDC->FillRect(rc, &m_brush2);

            return m_brush2;
        }
    }
    return hbr;
}

클래스위저드에서 IDC_EDIT2의 EN_CHANGE 이벤트 핸들러를 추가한다.
이 핸들러를 추가하는 이유는 두번째 에디트는 글자의 배경이 뒤에 그려지는 해치 브러쉬의
패턴을 덥어쓰는 걸 막아주기 위하여 TRANSPARENT 속성을 주었으므로, 글씨의 뒷부분을
그려주지 않게된다. 그러므로 잔상이 남게되어 글자에 대한 변경이 발생하면
배경을 다시 그려주도록 하기 위해서이다.
void CSssDlg::OnChangeEdit2()
{
    CRect rc;
    GetDlgItem(IDC_EDIT2)->GetWindowRect(rc);
    ScreenToClient(rc);
    InvalidateRect(rc);
}

49.zip
0.06MB

아래 그림을 보면 배경을 다양한 형태로 처리할 수 있음을 알수 있다.
사실상 저렇게 쓰는 경우는 별반 없지만... 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;
   
}

56.zip
0.04MB



---------------------------------------------------------------------------------
이 부분을 진행하다 보니, 만약 패턴 브러쉬를 넣었을 경우는 어떻게 될까? 라는
생각이 들어서 별도로 진행해 보았다.

이 그림은 위의 소스 일부를 수정하여, 변경해 본 것으로.. 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;
}

48.zip
0.04MB



에디트 컨트롤 편에서와 마찬가지고 WM_CTLCOLOR 라는 이벤트를 이용하여 글자색과 배경색을 변경할 수 있다.

클래스 위저드에서 WM_CTLCOLOR 을 선택한 후에 Add Function 버튼을 눌러 이벤트 핸들러를 추가한다.

저걸 추가하고 나면 화면상에 다음과 같은 코드가 자동으로 추가됩니다.

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

나는 Text 컨트롤을 대상으로 작업을 하므로 CTLCOLOR_STATIC 를 사용할 것입니다.
그럼 다음과 같은 코드를 추가해 봅니다.

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));
            pDC->SetBkColor(RGB(0, 255, 0));
        }
    }
    // TODO: Return a different brush if the default is not desired
    return hbr;
   
}

위와 같이 설정하면 모든 스태틱 컨트롤에 영향을 준다. 실행 결과 화면은 다음과 같다.

필요한 컨트롤만 색상을 변경하려면 다음과 같은 추가 작업이 필요하다.
좌측 상단의 첫번째 컨트롤의 속성창을 열어서 아이디를  IDC_STATIC_1 이라고 변경한다.
그리고 다음과 같이 코드를 변경한다.

HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   
    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;
}


실행 결과 화면은 다음과 같다

23.zip
0.04MB

저번에 이어 에디트 컨트롤을 사용하면서 글자색이나 배경색을 바꾸는 것에 대하여 알아보자.
이 기능은 에디트 컨트롤 뿐만 아니라, 거의 모든 문자열 입출력이 있는 컨트롤에 해당하는 기능이므로
잘 알아두면 다른 컨트롤에서도 쉽게 사용할 수 있다.

다이알로그의 이벤트 중에 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)으로 바꿔라 입니다.

여러개를 한꺼번에 바꾸거나, 그런건 머 위의 코드를 약간 수정하면 될테니 그건 손수 한번 해보세요.

다음에는 에디트 컨트롤의 폰트를 한번 변경해 보도록 하겠습니다.

13.zip
0.03MB

+ Recent posts