65.9K
CodeProject 正在变化。 阅读更多。
Home

树形下拉框控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (17投票s)

2011 年 4 月 27 日

CPOL

1分钟阅读

viewsIcon

78953

downloadIcon

4846

树形下拉框控件

TreeCComboBoxControl/treecombobox.gif

引言

最近,我需要一个在下拉框内部的树形控件,并在 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 日:添加了 CTreeCtrlGetTreeCtrl() 方法到 CTreeComboBox 类,现在它对树形控件具有完全访问权限。
  • 2013 年 5 月 10 日:更新了控件存档。
  • 2014 年 10 月 16 日:下拉框根据屏幕位置(向下或向上)展开;下拉框无法通过 Alt+F4 关闭。
  • 2014 年 11 月 14 日:我更新了代码,以便在较新的 Visual Studio 版本(例如 VS2008)中使用。
  • 2014 年 11 月 18 日:我添加了通过 F4 展开下拉框的可能性。我添加了 CComboTreeCtrlExt 类,以便自定义下拉框的树形控件,而不会弄乱 CComboTreeCtrl 类。
© . All rights reserved.