1
我有一個對話框,裏面有一個樹形視圖,並且想要在樹展開或摺疊時自動重新調整大小,以避免滾動條或空間過大。如何獲得避免滾動條的樹視圖控件的最小大小?
爲了做到這一點,我需要一些方法來找到樹視圖的「所需」大小,即最小的大小足以避免顯示滾動條。
有什麼建議嗎?
編輯:所以,我在那裏一半。我可以通過計算可見物品的數量並乘以TreeView_GetItemHeight
來確定高度。我仍然不知道如何找到寬度,但是...
我有一個對話框,裏面有一個樹形視圖,並且想要在樹展開或摺疊時自動重新調整大小,以避免滾動條或空間過大。如何獲得避免滾動條的樹視圖控件的最小大小?
爲了做到這一點,我需要一些方法來找到樹視圖的「所需」大小,即最小的大小足以避免顯示滾動條。
有什麼建議嗎?
編輯:所以,我在那裏一半。我可以通過計算可見物品的數量並乘以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讓我走上正軌。
對每個節點使用TreeView_GetItemRect()。 – 2015-03-13 18:07:17
@HansPassant感謝您的建議,不幸的是,'TreeView_GetItemRect'只適用於在客戶區域內可見的項目,所以確定樹視圖使項目可見有多大是沒有用的。 – zennehoy 2015-03-13 18:59:25
您無法獲取不可見節點的大小。所以使用它* *後,你可以看到它。 – 2015-03-13 19:04:31