블로그 이미지
인생의무한루프
인생에 무한루프.....

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

Tag

Recent Post

Archive

Recent Comment

Recent Trackback

2008. 12. 17. 15:37 Appication/VC++_Control

글자 색상과 배경색 2 ( MFC ComboBox 예제 )

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

우선 다이알로그에 콤보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())
            {
                // 드롭다운 스타일일 경우는 에디트에 포커스가 있으므로 컨트롤 아이디가 1001이다.
                // 드롭리스트일 경우는 콤보 자체에 포커스가 가있게된다.

                UINT nID = pWnd->GetDlgCtrlID();
                if(nID == 1001)
                    nID = pWnd->GetParent()->GetDlgCtrlID();

                switch(nID)
                {
                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;
}







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

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

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



Posted by 까막백(홈페이지 이동)
posted by 인생의무한루프