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

时间:2015-03-13 08:29:06

标签: c++ winapi

我有一个内部有树视图的对话框,并希望在展开或折叠树时自动重新调整对象的大小,以避免滚动条或空间过大。

为了做到这一点,我需要一些方法来找到"期望"树视图的大小,即足够大的最小尺寸,以避免显示滚动条。

有什么建议吗?

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

1 个答案:

答案 0 :(得分: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让我走上正轨。