【问题标题】:How to change the selection from one item to the selected item in tree control?如何将选择从一项更改为树控件中的选定项?
【发布时间】:2014-11-04 03:54:48
【问题描述】:

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

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

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

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

谁能让我知道如何使选择保留在根项目和树初始状态应该 尽量不要展开。

【问题讨论】:

  • 您是如何创建复选框的?使用 TVS_CHECKBOXES。当您删除所有处理程序时,树控件中没有神秘的焦点更改。所以我无法理解你的问题。如果您在树控件中创建复选框 Windows,则您使用了错误的方法。
  • 我创建了一个 TVS_CHECKBOXES 样式的树形控件。我将用图像更新我的原始帖子,请仔细阅读它们。

标签: mfc treecontrol


【解决方案1】:

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

【讨论】:

  • 我应该在哪里添加折叠树是它在 OnTvnItemChangedTree 中吗?如果是这样,每次我点击任何项目时都会调用它并且树正在折叠并且焦点不在根节点上。可以你请帮忙我应该在哪里折叠树。我应该在上面提到的 OnTvnItemChanged 的​​条件下添加它。我在上面的条件中添加了这样的,m_TreeCtrl.Expand(m_TreeCtrl.GetRootItem(),TVE_COLLAPSE); m_TreeCtrl.SelectItem(m_TreeCtrl.GetRootItem());但它不起作用。请你帮我解决这个问题。
  • 在你填充它之后,大概在 OnInitDialog 左右。我从您的问题中了解到的是您填充树,在 OnItemChanged 中做一些事情,并且您所做的事情会改变选择。但是您要问的是如何在树初始化后立即选择某个项目。因此,因此我的答案可能过于简单,“然后在创建并填充树后将您的选择设置回您想要的样子”。
【解决方案2】:

最后我解决了。为了避免在初始化时扩展并将焦点从一个项目移动到选中的项目,可以如下实现,

对于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中添加,现在终于实现了我想要的。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 2015-04-05
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多