2015-03-13 2 views
1

У меня есть диалог с древовидным представлением внутри него и хотел бы, чтобы диалог автоматически изменялся автоматически, когда дерево было развернуто или свернуто, чтобы избежать полос прокрутки или избыточного пространства.Как получить минимальный размер элемента управления TreeView, который позволяет избежать полос прокрутки?

Для этого мне нужно найти способ «желаемого» размера дерева, т. Е. Наименьший размер, достаточно большой, чтобы не отображать полосы прокрутки.

Любые предложения?

Редактировать: Итак, я на полпути. Я могу определить высоту, подсчитывая количество видимых элементов и умножая на TreeView_GetItemHeight. Я до сих пор не знаю, как найти ширину, однако ...

+0

Используйте TreeView_GetItemRect() для каждого узла. –

+0

@ HansPassant Спасибо за это предложение, к сожалению, 'TreeView_GetItemRect' работает только для элементов, которые видны внутри клиентской области, и поэтому нецелесообразно определять, насколько велика возможность сделать дерево видимым. – zennehoy

+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 за то, что вы на правильном пути.

Смежные вопросы