2012-07-13 65 views
0

在我的CTreeCtrl中,當我展開一個不可見的節點時,控件會自動重新定位樹,使展開的節點可見。有什麼辦法可以防止這種行爲?CTreeCtrl展開而不滾動

用例:我有一棵樹正在從遠程源異步加載項目,並且可能正在構建樹的「底部」很長一段時間,並且當前已完成跳轉到每個節點的樹行爲對用戶來說非常分散注意力。

當前的解決辦法:

/****************************************************************************** 
Expand an item while retaining the tree position 
******************************************************************************/ 
void CFileOpenTreeView::ExpandWithoutJumping(HTREEITEM hItem) 
{ 
    // This still flickers for some reason, but at least it doesn't jump 
    LockWindowUpdate(); 
    HTREEITEM hFirstVisible = GetTreeCtrl().GetFirstVisibleItem(); 

    GetTreeCtrl().Expand(hItem, TVE_EXPAND); 

    GetTreeCtrl().SelectSetFirstVisible(hFirstVisible); 
    UnlockWindowUpdate(); 
    Invalidate(); 
} 

回答

1

要回答你的問題直接,你可以關閉窗口刷新,同時控制被填充,使用CWnd::LockWindowUpdate()CWnd::UnlockWindowUpdate()

總而言之,如果可以的話,您可能需要重新考慮您的策略。例如,您可以填充樹中的子節點而不擴展父節點。另外,在你所描述的用例中,只有當父節點被用戶展開時,纔可能需要考慮動態填充節點的子節點。

+0

我目前的解決方法鎖定窗口,但由於某種原因,它仍然閃爍,我希望有一些'hackish'的方式。在這種情況下,我需要展開節點,因爲用戶期望樹返回到其先前的狀態。並且這個特定的樹也在父節點被擴展時加載節點fwiw。無論如何感謝:> – hunter 2012-07-17 00:01:16