我有一个树控件正在填充一些值。并且在这几个树节点中由 复选框,而很少没有。我的问题是最初枚举树时的默认值 选择位于第一个根节点上,此根节点由每个子节点中的三个子节点组成 由复选框组成。这是我的问题,
现在,当我展开树并尝试单击包含复选框的子项时(单击复选框) 在鼠标左键按下之前,焦点将转到我们正在检查的项目上,然后当左键单击时 选择将恢复为根项目(或之前选择的项目)。
为了解决这个问题,我尝试了这个,
//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
中的那个项目包括最后一项的句柄,但我们如何才能使得最初树不应该扩展,并且当我检查任何节点时选择应该正常工作,然后选择应该更改为选中的项。
任何人都可以告诉我如何让选择保留在根项目和树的初始状态应该 不要扩大。
答案 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
,现在终于实现了我想要的。