树形下拉框控件
树形下拉框控件
引言
最近,我需要一个在下拉框内部的树形控件,并在 Google 上搜索时找到了一些东西,但它比我需要的要复杂一些。我开始自己编写一个,并与大家分享这个结果。
Using the Code
所有内容都基于 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);
}
第一次点击,或向下箭头键,树形窗口将会打开。
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);
}
和
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);
}
但树形窗口应该在第二次点击、按下 Esc 键、Enter 键或失去焦点时关闭。我尝试了几种方法但都失败了,所以我的解决方案是向父窗口(CTreeComboBox
)发送一个关闭的消息。
LRESULT CTreeComboBox::OnCloseControl(WPARAM wParam, LPARAM lParam)
{
TreeCtrlDone();
m_Tree.ShowWindow(SW_HIDE);
m_bTree = FALSE;
return 1;
}
ComboBox
必须使用 CBS_DROPDOWNLIST
设置,否则你会收到断言错误 :)
为了使用这个控件,你需要 #include "TreeComboBox.h"
,并像使用树形控件一样处理下拉框(你可以在 示例项目 中看到如何操作)。
尽情享受吧!
历史
- 2011 年 4 月 26 日:初始版本。
- 2012 年 2 月 20 日:添加了
CTreeCtrl
和GetTreeCtrl()
方法到CTreeComboBox
类,现在它对树形控件具有完全访问权限。 - 2013 年 5 月 10 日:更新了控件存档。
- 2014 年 10 月 16 日:下拉框根据屏幕位置(向下或向上)展开;下拉框无法通过 Alt+F4 关闭。
- 2014 年 11 月 14 日:我更新了代码,以便在较新的 Visual Studio 版本(例如 VS2008)中使用。
- 2014 年 11 月 18 日:我添加了通过 F4 展开下拉框的可能性。我添加了 CComboTreeCtrlExt 类,以便自定义下拉框的树形控件,而不会弄乱 CComboTreeCtrl 类。