当TREEVIEW展开后,如果节点超过显示宽度会自动显示水平滚动条,请问其内部机制是怎样实现的。我想根据展开内容动态调整TREEVIEW的宽度,但不知道怎样判断展开的节点的最右侧是多少

解决方案 »

  1.   

    UINT i, uCount = pmyTreeCtrl->GetVisibleCount();
    HTREEITEM hItem = pmyTreeCtrl->GetFirstVisibleItem();// Toggle the check state of all the visible items.
    int nWidth= 0;
    for (i=0;i < uCount;i++)
    {
       CRect r;
       pmyTreeCtrl->GetItemRect(hmyItem, &r, FALSE);   hItem = pmyTreeCtrl->GetNextVisibleItem(hItem);
       nWidth = __max(nWidth, r.Width());
    }
      

  2.   

    有没有不遍历所有节点就能判断出TREEVIEW内容的最大宽度的方法
      

  3.   

    参考如下代码:
    function GetWidthOfTreeView(TreeView: TTreeView): Integer;
    var
      i, W: Integer;
    begin
     Result := 0;
     for i := 0 to TreeView.items.Count - 1 do
       if TreeView.Items[i].IsVisible then
       begin
         W := TreeView.Items[i].DisplayRect(True).Right;
         if Result < W then
           Result := W;
       end;
     Inc(Result, 8);
    end;procedure TForm1.TreeView1Expanded(Sender: TObject; Node: TTreeNode);
    begin
      TreeView1.Width := GetWidthOfTreeView(TreeView1);
    end;procedure TForm1.TreeView1Collapsed(Sender: TObject; Node: TTreeNode);
    begin
      TreeView1.Width := GetWidthOfTreeView(TreeView1);
    end;
      

  4.   

    可以根据滚动条的Range来设置控件的宽度
    比如可以在树的OnExpanded和OnCollapsed加入如下代码:
    var
      si: TScrollInfo;
    begin
      si.cbSize := SizeOf(si);
      si.fMask := SIF_ALL;
      TreeView1.Width := 1;
      if GetScrollInfo(TreeView1.Handle, SB_HORZ, si) then
        TreeView1.Width := si.nMax + 10;
    end;
      

  5.   

    谢谢大家,特别是  hahafan(注意!此人前途迷茫) 
    不过能否告诉我,treeview内部根据什么来显示或掩藏水平滚动条的,即treeview是怎样判断目前展开的节点的宽度已经超出了本身的宽度,从而显示滚动条的