我有一个内部有树视图的对话框,并希望在展开或折叠树时自动重新调整对象的大小,以避免滚动条或空间过大。
为了做到这一点,我需要一些方法来找到"期望"树视图的大小,即足够大的最小尺寸,以避免显示滚动条。
有什么建议吗?
编辑:所以,我已经到了一半。我可以通过计算可见项目的数量并乘以TreeView_GetItemHeight
来确定高度。我仍然不知道如何找到宽度,但是......
答案 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让我走上正轨。