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.
combobox
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.
CTreeComboBox
CComboBox
CComboTreeCtrl
CTreeComboBox::PreSubclassWindow
m_Tree
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 :)
ComboBox
CBS_DROPDOWNLIST
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!
CTreeCtrl
GetTreeCtrl()