Mfc 如何在树控件中将选择从一项更改为选定项?

Mfc 如何在树控件中将选择从一项更改为选定项?,mfc,treecontrol,Mfc,Treecontrol,我有一个树控件,它正在填充一些值 复选框,而很少有复选框没有。我的问题最初是当树被枚举为默认值时 选择位于第一个根节点上,此根节点由三个子节点组成,其中每个子节点 包含复选框。我的问题是 现在,当我展开树并尝试单击由复选框组成的子项时(单击复选框) 直到鼠标左键按下,焦点才转到我们正在检查的项目,当鼠标左键单击向上时,焦点才转到我们正在检查的项目 所选内容将还原回根项目(或先前选择的项目) 为了解决这个问题我试过了 //TVN_ITEMCHANGED void CDriverSetupVie

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

现在,当我展开树并尝试单击由复选框组成的子项时(单击复选框) 直到鼠标左键按下,焦点才转到我们正在检查的项目,当鼠标左键单击向上时,焦点才转到我们正在检查的项目 所选内容将还原回根项目(或先前选择的项目)

为了解决这个问题我试过了

 //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中枚举树时,树的代码段如下所示,

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

现在,当鼠标左键点击复选框时,选择再次返回到上一个节点

现在,当我在OnTvnItemChangedTree中使用这段代码时,我可以将所选内容获取到选中的节点,但最初当我启动应用程序时,该树将展开,所选内容位于最后一个子项上,如下所示

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

任何人都可以让我知道如何使选择保持在根项目和树的初始状态应该
不要扩展。

我可能误解了这个问题,因为解决方案似乎很明显,但为什么不在创建树时折叠树并将焦点设置为第一项呢?所以,在您添加了所有子项之后?

我终于解决了它。为了避免在初始化时展开并将焦点从一个项移动到选中的项,可以实现如下操作:

对于
NM\u,单击
notification添加这段代码,其工作原理与charm类似

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);
    }

}

我所犯的唯一错误是在
ontvitemchange
中添加了此代码,而不是在
OnNMClickTree
中添加了此代码,现在我终于实现了我想要的目标。

以及您是如何创建复选框的?使用TVS_复选框。删除所有处理程序时,树控件中的mystique焦点不会发生更改。所以我不能理解你的问题。如果在树控件内创建复选框窗口,则使用了错误的方法。我创建了一个TVS_复选框样式的树控件。我将使用图像更新我的原始帖子,请仔细阅读。我应该在哪里添加折叠树?它是在OnTvItemChangedTree中吗?如果是这样,每次我单击任何项目时都会调用此函数,并且树正在折叠,而焦点不在根节点上。您可以帮助我在哪里折叠树。我应该在OnTvItemChanged的相同条件下添加它吗我上面提到过,我在上面的条件中添加了如下内容:m_TreeCtrl.Expand(m_TreeCtrl.GetRootItem(),TVE_COLLAPSE);m_TreeCtrl.SelectItem(m_TreeCtrl.GetRootItem());但它不起作用。你能帮我解决这个问题吗。在你填充它之后,大概是在OnInitDialog中吧。我从你的问题中了解到,你填充了树,在OnItemChanged中做了一些事情,你所做的事情改变了选择。但您要问的是如何在树初始化后立即选择某个项目。因此,我的答案可能太简单了,“然后在创建和填充树之后,将您的选择设置回您希望的状态”。