0

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

现在,当我展开树并尝试单击由复选框组成的子项时(单击复选框)直到鼠标左键向下,焦点到达我们正在检查的项目,当左键单击时,然后选择正在恢复到根项目(或之前选择的项目)。

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

 //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最后初始化之后,该项目包含对最后一项的句柄,但是当我检查任何节点时,我们如何才能使树最初不应该扩展并且选择应该正常工作,然后选择应该更改为选中的项目。

任何人都可以让我知道如何使选择保留在根项目上,并且树初始状态应该是未扩展。

4

2 回答 2

0

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

于 2014-11-05T13:52:35.213 回答
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,现在终于实现了我想要的。

于 2014-11-07T05:45:18.370 回答