0

私は古いMFCアプリケーションに取り組んでいます。アプリケーションにはTreeViewコントロールがあります。OnItemExpanding関数はオーバーライドされます。TreeViewItemの子を展開することで取得しています。ノードが初めて拡張された場合、その子にデータが入力されます。アイテムの子がない場合、展開アイコン(+記号)がTreeViewItemから削除されます。

ここで問題となるのは、子を持たない1つのノードを拡張したことです。いくつかの作業を行った後、子がそのノードに追加されます。しかし、展開アイコンがないため、新しく追加された子を取得できなくなりました。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

あなたは、共通のコントロールライブラリがすでにあなたのためにできることを再発明しようとしています。

あなたがする必要があるのは、アイテムに子供がいるかどうかを知る必要があるときに通知itemex.cChildren = I_CHILDRENCALLBACKを送信するようにツリーに指示する「フォルダ」アイテムセットを挿入するときです。TVN_GETDISPINFOその後、同様にTVN_GETDISPINFOすべての個々の子に送信されます。

どうしても必要な場合にのみ通知を送信するので、無駄に高価なことをする必要はありません。

于 2013-03-07T11:26:41.890 に答える
2

TVITEMのcChildrenを「one」に設定する必要があります。

TVITEM tvItem = {0};
tvItem.mask   = TVIF_HANDLE | TVIF_CHILDREN;
tvItem.hItem  = selectedNode;
tvItem.cChildren = 1;
tree.SetItem(&tvItem);
于 2013-03-07T11:08:21.047 に答える
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 に答える