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

우선 다이알로그에 콤보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

+ Recent posts