我正在开发一个旧的MFC应用程序。应用程序中有一个TreeView控件。 OnItemExpanding函数被覆盖。我正在扩展它的TreeViewItem的孩子。如果第一次展开节点,则会填充其子节点。如果项目没有子项,则从TreeViewItem中删除展开图标(+符号)。
现在的问题是我扩展了一个没有孩子的节点。完成一些工作后,将孩子添加到该节点。但是现在我无法获得新添加的孩子,因为缺少扩展图标。我如何刷新TreeView中的特定节点。我创建了一个刷新按钮。在那里我能够在TreeView中找到我当前选择的节点,但接下来是什么。
这是代码。
void CMyTreeView::OnItemExpanding(CTreeCtrl& tree, NMHDR* pNMHDR, LRESULT* pResult)
{
//This is only called when I click on expand (+ sign)
//some check here which populates children.
}
void CMyTreeView::RefreshNode(CTreeCtrl& tree, HTREEITEM selectedNode)
{
// What should I do here?
}
答案 0 :(得分:2)
你必须将TVITEM的cChildren设置为'one':
TVITEM tvItem = {0};
tvItem.mask = TVIF_HANDLE | TVIF_CHILDREN;
tvItem.hItem = selectedNode;
tvItem.cChildren = 1;
tree.SetItem(&tvItem);
答案 1 :(得分:2)
您正在尝试重新发明公共控件库已经可以为您做的事情。
当您插入“文件夹”项集itemex.cChildren = I_CHILDRENCALLBACK
时,您需要做的是告诉树在需要知道项目是否有子项时向您发送TVN_GETDISPINFO
通知。然后,它会为每个孩子发送TVN_GETDISPINFO
。
它只会在绝对必要时发送通知,因此您无需徒劳地做任何昂贵的事情。
答案 2 :(得分:1)
我想说,你需要改变ItemState:http://msdn.microsoft.com/de-de/library/ce034e69%28v=vs.80%29.aspx
BOOL SetItemState( HTREEITEM hItem, UINT nState, UINT nStateMask );
看看HTREEITEM:
typedef struct tagTVITEM {
UINT mask;
HTREEITEM hItem;
UINT state;
UINT stateMask;
LPTSTR pszText;
int cchTextMax;
int iImage;
int iSelectedImage;
int cChildren;
LPARAM lParam;
} TVITEM, *LPTVITEM;
cChildren Type: int
Flag that indicates whether the item has associated child items. This member can be one of the following values.