3

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

4

1 回答 1

3

我能找到滚动 TreeView 的唯一方法是发送它WM_VSCROLL的值为SB_LINEDOWN/ SB_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;
于 2013-08-28T22:08:37.963 回答