2013-03-07 90 views
0

我正在使用旧的MFC应用程序。应用程序中有一个TreeView控件。 OnItemExpanding函数被覆盖。我通过扩展了TreeViewItem的子元素。如果一个节点第一次扩展它的子节点。如果项目中没有子项,则展开图标(+符号)将从TreeViewItem中移除。重新展开treeview项目

现在的问题是,我扩大了一个没有孩子的节点。在做一些工作之后,孩子被添加到该节点。但是现在因为扩展图标丢失,我无法获得新添加的子项。我怎样才能刷新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? 
} 

回答

2

你必须设置TVITEM '一' 来cChildren:

TVITEM tvItem = {0}; 
tvItem.mask = TVIF_HANDLE | TVIF_CHILDREN; 
tvItem.hItem = selectedNode; 
tvItem.cChildren = 1; 
tree.SetItem(&tvItem); 
+0

谢谢,它的工作。我可以看到扩展(+符号)。 – 2013-03-07 11:33:21

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. 
2

您正在试图重塑什么通用控件库已经可以为你做。

你需要做的是,当你插入一个“文件夹”项目集itemex.cChildren = I_CHILDRENCALLBACK这将告诉树发送你TVN_GETDISPINFO通知时,它需要知道该项目是否有孩子。然后,它会为每个孩子发送TVN_GETDISPINFO

它只会在绝对必要时发送通知,因此您不需要花费任何昂贵的东西。

+0

I_CHILDRENCALLBACK只是询问Windows是否应该在Treeview项目的左侧绘制“+”号。只有在绝对必要时才发送通知是不正确的。当我只将鼠标移到树形视图上时,我看到许多消息。 – Elmue 2017-03-31 12:50:29