当我用TTreeView打开表单时,我用一些数据填充并选择了一些节点。但是我需要使选定的节点在控件的中心可见(当然,可能的话)。我找不到使用标准TTreeView组件的方法。
有任何想法吗 ?

最佳答案

我可以找到的滚动TreeView的唯一方法是向它发送一个值为WM_VSCROLL / SB_LINEDOWNSB_LINEUP。由于某种原因,控件似乎不响应SB_THUMBPOSITION的滚动值,例如富编辑。因此,下面的尝试通过向控件发送一堆行滚动消息来使节点或多或少地居中。尝试看看自己是否适合您的需求。

var
  DR, CR: TRect;
  ScrollPx, ScrollLines, i: Integer;
begin
  if Assigned(TreeView1.Selected) then begin

    // calculate how many *pixels* should we scroll
    DR := TreeView1.Selected.DisplayRect(False);
    CR := TreeView1.ClientRect;
    ScrollPx := - Round((CR.Bottom / 2) - DR.Top - ((DR.Bottom - DR.Top) / 2));

    // how many lines does it correspond to
    ScrollLines := ScrollPx div TreeView_GetItemHeight(TreeView1.Handle);

    // scroll that many lines
    if ScrollLines > 0 then
      for i := 1 to ScrollLines do
        TreeView1.Perform(WM_VSCROLL, MakeWParam(SB_LINEDOWN, 0), 0)
    else if ScrollLines < 0 then
      for i := ScrollLines to -1 do
        TreeView1.Perform(WM_VSCROLL, MakeWParam(SB_LINEUP, 0), 0);
  end;

关于delphi - 如何将特定TreeView节点的位置居中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18490960/

10-10 17:50