【发布时间】: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