2015-03-13 46 views
1

我有一個對話框,裏面有一個樹形視圖,並且想要在樹展開或摺疊時自動重新調整大小,以避免滾動條或空間過大。如何獲得避免滾動條的樹視圖控件的最小大小?

爲了做到這一點,我需要一些方法來找到樹視圖的「所需」大小,即最小的大小足以避免顯示滾動條。

有什麼建議嗎?

編輯:所以,我在那裏一半。我可以通過計算可見物品的數量並乘以TreeView_GetItemHeight來確定高度。我仍然不知道如何找到寬度,但是...

+0

對每個節點使用TreeView_GetItemRect()。 – 2015-03-13 18:07:17

+0

@HansPassant感謝您的建議,不幸的是,'TreeView_GetItemRect'只適用於在客戶區域內可見的項目,所以確定樹視圖使項目可見有多大是沒有用的。 – zennehoy 2015-03-13 18:59:25

+0

您無法獲取不可見節點的大小。所以使用它* *後,你可以看到它。 – 2015-03-13 19:04:31

回答

0

這不是很完美(它似乎不可能有TreeView_GetItemRect水平包括整行直到文本的末尾),但下面的作品非常適合用於禁用水平滾動的用例。

void Dialog::getDimensionTreeView(unsigned int id, 
            unsigned int &width, unsigned int &height) { 
    HWND item = GetDlgItem((HWND)_hwnd, id); 
    if(!item) { 
     width = 0; 
     height = 0; 
     return; 
    } 

    RECT area = { }; 
    HTREEITEM node = TreeView_GetRoot(item); 
    do { 
     RECT rc; 
     LPRECT prc = &rc; 
     // Ideally this would use `fItemRect`=FALSE, but that seems 
     // to just return the current width of the treeview control. 
     TreeView_GetItemRect(item, node, prc, TRUE); 
     if(rc.left < area.left) area.left = rc.left; 
     if(rc.right > area.right) area.right = rc.right; 
     if(rc.top < area.top) area.top = rc.top; 
     if(rc.bottom > area.bottom) area.bottom = rc.bottom; 
    } while((node = TreeView_GetNextVisible(item, node))); 
    width = area.right - area.left; 
    height = area.bottom - area.top; 
} 

感謝Hans Passant讓我走上正軌。