如何将选择从一个项目更改为树控件中的选定项目?

时间:2014-11-04 03:54:48

标签: mfc treecontrol

我有一个树控件正在填充一些值。并且在这几个树节点中由 复选框,而很少没有。我的问题是最初枚举树时的默认值 选择位于第一个根节点上,此根节点由每个子节点中的三个子节点组成 由复选框组成。这是我的问题,

现在,当我展开树并尝试单击包含复选框的子项时(单击复选框) 在鼠标左键按下之前,焦点将转到我们正在检查的项目上,然后当左键单击时 选择将恢复为根项目(或之前选择的项目)。

为了解决这个问题,我尝试了这个,

 //TVN_ITEMCHANGED 
void CDriverSetupView::OnTvnItemChangedTree(NMHDR *pNMHDR, LRESULT *pResult)
{
NM_TREEVIEW* pNewTreeView = (NM_TREEVIEW*)pNMHDR;

if(NULL != pNewTreeView->itemNew.hItem)
{
   m_TreeCtrl.Select(pNewTreeView->itemNew.hItem,TVGN_CARET | TVGN_FIRSTVISIBLE | TVGN_DROPHILITE); 
   m_TreeCtrl.SelectItem(pNewTreeView->itemNew.hItem);
   m_TreeCtrl.SelectDropTarget(pNewTreeView->itemNew.hItem);
}

}

如果我这样做,那么我可以选择任何孩子,我检查一切都很酷。 但是最初在启动我的应用程序时,树正在扩展,并且选择不在根项目上 ,它正在转向最后一项。

请查看以下图片以便更好地理解, 当枚举树而没有OnTvnItemChangedTree中的代码片段时,树看起来像这样, enter image description here

现在,当鼠标左键按下第一个复选框时,选择似乎已更改为复选框 项目,

enter image description here

现在当鼠标左键按下复选框时,选择再次恢复到上一个​​节点

enter image description here

现在,当我在OnTvnItemChangedTree中使用这段代码时,我能够选择已检查的节点,但最初当我启动我的应用程序时,树正在扩展,并且选择是最后一个子项,即如下,

enter image description here

在上面的图片中,我能够得到我想要的但是树正在扩展并且选择到最后一个项目,我知道这是因为在初始化之后pNewTreeView->itemNew.hItem中的那个项目包括最后一项的句柄,但我们如何才能使得最初树不应该扩展,并且当我检查任何节点时选择应该正常工作,然后选择应该更改为选中的项。

任何人都可以告诉我如何让选择保留在根项目和树的初始状态应该 不要扩大。

2 个答案:

答案 0 :(得分:0)

我可能误解了这个问题,因为解决方案看起来很明显,但为什么你不打算折叠树并在创建时将焦点设置到第一个项目?所以,在你添加了所有孩子之后?

答案 1 :(得分:0)

最后我解决了它。为了避免在初始化时进行扩展并将焦点从一个项目移动到检查项目,可以按如下方式实现:

对于NM_CLICK通知,请添加这段代码,其功能类似于魅力。

void CMyTreeCtrl::OnNMClickTree(NMHDR *pNMHDR, LRESULT *pResult)
{
    if(NULL != pNewTreeView->itemNew.hItem)
    {
        m_TreeCtrl.Select(pNewTreeView->itemNew.hItem,TVGN_CARET | TVGN_FIRSTVISIBLE | TVGN_DROPHILITE); 
        m_TreeCtrl.SelectItem(pNewTreeView->itemNew.hItem);
    }

}

我唯一的错误就是在OnTvItemChanged中添加了这段代码而是添加了OnNMClickTree,现在终于实现了我想要的。