0

我正在开发一个旧的 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?
}
4

3 回答 3

2

您必须将 TVITEM 的 cChildren 设置为“一”:

TVITEM tvItem = {0};
tvItem.mask   = TVIF_HANDLE | TVIF_CHILDREN;
tvItem.hItem  = selectedNode;
tvItem.cChildren = 1;
tree.SetItem(&tvItem);
于 2013-03-07T11:08:21.047 回答
2

您正在尝试重新发明通用控件库已经可以为您做的事情。

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

它只会在绝对必要时发送通知,因此您无需白做任何昂贵的事情。

于 2013-03-07T11:26:41.890 回答
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. 
于 2013-03-07T11:08:42.670 回答