본문 바로가기

Windows/MFC

콤보박스(ComboBox)의 리스트박스(ListBox)의 크기를 바꾸는 방법

ComboBox의 ListBox의 크기를 바꾸는 방법
ComboBox의 CWnd::OnCtlColor()를 처음 부를 때, ListBox의 핸들을 알아내고 이것을 이용해서 ListBox의 크기를 바꾸어 준다.

[code]
BOOL    m_bRectFirst = TRUE;
BOOL    m_bCtrlFirst = TRUE;

HBRUSH CNewComboBox::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    if (nCtlColor == CTLCOLOR_LISTBOX){
        if (m_bRectFirst){
            pWnd->GetWindowRect(m_rcListBox);
            m_bRectFirst = FALSE;
        }
        
        if (m_bCtrlFirst){
            m_bCtrlFirst = FALSE;
            
            pWnd->MoveWindow(m_rcListBox.left, m_rcListBox.top,
                m_rcListBox.Width() + 100,
                m_rcListBox.Height(), TRUE);
            // 100만큼 늘려 준다.
        }
        else{
            m_bCtrlFirst = TRUE;
        }
    }
    
    return CComboBox::OnCtlColor(pDC, pWnd, nCtlColor);
}
[/code]

여기에서 m_bRectFirst의 기능은 ListBox Control이 처음 보일 때를 감지하기 위한 것이다. 그리고, m_bCtrlFirst가 사용된 이유는 처음 MoveWindow()가 실행되어서 크기가 조정되면 ListBox가 다시 그려지므로, 다시 CWnd::OnCtlColor()라 불려진다. 그러면, 다시 MoveWindow()가 불려져서 다시 OnCtlColor()가 불려지는 것이 계속 반복이 될 것이다. 그래서, 이것을 막기 위해서 m_bCtrlFirst를 플래그로 두어서 MoveWindow()때문에 불러지는 OnCtlColor()는 무시하도록 했다.