如何获得避免滚动条的树视图控件的最小尺寸?

How to get the minimum size of a treeview control that avoids scroll bars?

我有一个内部有树视图的对话框,我希望当树展开或折叠时对话框自动调整自身大小以避免滚动条或过多space。

为此,我需要一些方法来找到树视图的 "desired" 大小,即足以避免显示滚动条的最小尺寸。

有什么建议吗?

编辑:所以,我已经完成了一半。我可以通过计算可见项的数量并乘以 TreeView_GetItemHeight 来确定高度。我仍然不知道如何找到宽度,但是...

它不是很完美(似乎不可能 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 让我走上正轨。