Click here to Skip to main content
Full site     10M members (40.5K online)    

Tree ComboBox Control

TreeCComboBoxControl/treecombobox.gif

Introduction

Recently, I needed a tree control inside a combobox, and during my search on Google I found something, but it was a little more complicated than I required. I started to draft one myself, and am sharing the result with you.

Using the Code

Everything is based on CTreeComboBox, which is derived from standard CComboBox. Here I have CComboTreeCtrl variable member and methods characteristic to tree control. In CTreeComboBox::PreSubclassWindow, I create and initialize m_Tree and stretch on combobox dropdown list.

void CTreeComboBox::PreSubclassWindow() 
{
    // TODO: Add your specialized code here and/or call the base class

    CComboBox::PreSubclassWindow();

    CRect rect(0, 0, 0, 0);
    DWORD dwStyle =  WS_POPUP | WS_BORDER | TVS_DISABLEDRAGDROP | 
    TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS | TVS_FULLROWSELECT | 
    TVS_CHECKBOXES;
    m_Tree.CreateEx(0, WC_TREEVIEW, NULL, dwStyle, rect, GetParent(), 0, NULL);
    m_Tree.Init(this);

    GetClientRect(rect);
    SetDroppedWidth(rect.Width());
    SetDroppedHeight(m_droppedHeight);

    dwStyle = 0x03 & GetStyle();
    ASSERT(dwStyle == CBS_DROPDOWNLIST);
}

At first click, or arrow key down, the tree window will open.

void CTreeComboBox::OnLButtonDown(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default

    m_bTree = ! m_bTree;
    if(m_bTree)DisplayTree();

//    CComboBox::OnLButtonDown(nFlags, point);
}

and:

BOOL CTreeComboBox::PreTranslateMessage(MSG* pMsg) 
{
    // TODO: Add your specialized code here and/or call the base class

    if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_DOWN)
    {
        DisplayTree();
        return TRUE;
    }

    return CComboBox::PreTranslateMessage(pMsg);
}

But tree window should close at second click, escape key, enter key or lost focus. I tried a few ways but I failed, so my solution was to send to the parent (CTreeComboBox) message to close.

LRESULT CTreeComboBox::OnCloseControl(WPARAM wParam, LPARAM lParam)
{
    TreeCtrlDone();
    m_Tree.ShowWindow(SW_HIDE);
    m_bTree = FALSE;

    return 1;
}

ComboBox must setup with CBS_DROPDOWNLIST or else you'll be ASSERT :)

In order to use this control , you need include #include "TreeComboBox.h" and further handle combobox like it is a tree control (you can see how in the sample project).

Enjoy it!

History

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search 
Per page   
Questioni vote of 5
xunonxyz
22 Mar '13 - 5:28 
QuestionWhen Click on the checkbox it can not hide and show noting on combox's Edit
maplewang
8 Aug '12 - 5:53 
GeneralMy vote of 5
huwuling
3 May '12 - 5:10 
GeneralRe: My vote of 5
Flaviu2
11 May '12 - 2:11 
Suggestionmodified in vs2003
magicpapacy
11 Mar '12 - 16:30 
GeneralVS2008 : ComboTreeCtrl behind
Member 7681881
16 May '11 - 5:00 
GeneralRe: VS2008 : ComboTreeCtrl behind [modified]
Flaviu2
18 May '11 - 19:38 

Last Updated 10 May 2013 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2013