2013-03-07 89 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