procedure TForm1.Button1Click(Sender: TObject);
var
  rCettemp: TRect;
  pan : Tpanel;
begin
    ListView1.Items.Add.Caption :='123';
    rCettemp := ListView1.Items[0].DisplayRect(drBounds);
    rCettemp.Left  := rCettemp.Left + ListView1.columns[0].Width+5;
    rCettemp.Right := rCettemp.Left + ListView1.columns[1].Width-10;
    pan := TPanel.Create(Self);
    pan.Color := clred;
    pan.BevelOuter := bvNone;
    pan.Caption:= '';
    pan.Parent := ListView1;
    pan.BoundsRect := rCettemp;
    pan.Height := 13;
    ListView1.Items[0].Data := pan;
end;向ListView1中嵌套一个panel,代码如上。但是当拖动标题时,这个panel不会跟着移动。
我试验把 pan := TPanel.Create(Self);
    pan.Color := clred;
    pan.BevelOuter := bvNone;
    pan.Caption:= '';
    pan.Parent := ListView1;
    pan.BoundsRect := rCettemp;
    pan.Height := 13;
    ListView1.Items[0].Data := pan;
放到OnCustomDraw中,这样的话,会一直重绘。如何解决呢?谢谢!

解决方案 »

  1.   

    uses
      Types, // use EqualRect
      CommCtrl; // use ListView_GetColumnWidthprocedure TForm1.Button1Click(Sender: TObject);
    var
      rCettemp: TRect;
      pan: TPanel;
    begin
      ListView1.Items.Add.Caption :='123';
      rCettemp := ListView1.Items[0].DisplayRect(drBounds);
      rCettemp.Left  := rCettemp.Left + ListView1.columns[0].Width + 5;
      rCettemp.Right := rCettemp.Left + ListView1.columns[1].Width - 10;
      pan := TPanel.Create(Self);
      pan.Color := clRed;
      pan.BevelOuter := bvNone;
      pan.Caption:= '';
      pan.Parent := ListView1;
      pan.BoundsRect := rCettemp;
      pan.Height := 13;
      ListView1.Items[0].Data := pan;
    end;procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    var
      rCettemp: TRect;
      pan: TPanel;
    begin
      Pointer(pan) := Item.Data;
      if not Assigned(pan) then Exit;
      rCettemp := ListView1.Items[0].DisplayRect(drBounds);  rCettemp.Left := rCettemp.Left +
        ListView_GetColumnWidth(ListView1.Handle, 0) + 5;
      rCettemp.Right := rCettemp.Left +
        ListView_GetColumnWidth(ListView1.Handle, 1) - 10;
    // 这里是关键,如果用ListView1.columns[N].Width并不是实时的  if EqualRect(pan.BoundsRect, rCettemp) then Exit; // 无变化,就别处理
      pan.BoundsRect := rCettemp;
    end;
      

  2.   

    zswang(伴水清清)(专家门诊清洁工)   首先谢谢你的解答。如果我只添加一个panel是很好的,但是我添加了多个panel。情况还是闪动。
      

  3.   

    //你又不把你的调试代码贴出来
    //参考如下代码:
    uses
      Types, // use EqualRect
      CommCtrl; // use ListView_GetColumnWidthprocedure TForm1.Button1Click(Sender: TObject);
    var
      rCettemp: TRect;
      pan: TPanel;
    begin
      ListView1.Items.Add.Caption :='123';
      rCettemp := ListView1.Items[ListView1.Items.Count - 1].DisplayRect(drBounds);
      rCettemp.Left  := rCettemp.Left + ListView1.Columns[0].Width + 5;
      rCettemp.Right := rCettemp.Left + ListView1.Columns[1].Width - 10;
      pan := TPanel.Create(Self);
      pan.Color := clRed;
      pan.BevelOuter := bvNone;
      pan.Caption:= '';
      pan.BoundsRect := rCettemp;
      pan.Height := 13;
      pan.Parent := ListView1; //调整到最后
      ListView1.Items[ListView1.Items.Count - 1].Data := pan;
    end;procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
    var
      rCettemp: TRect;
      pan: TPanel;
    begin
      Pointer(pan) := Item.Data;
      if not Assigned(pan) then Exit;
      pan.Visible := (ListView1.TopItem.Index <= Item.Index); // 不在标题上闪烁  rCettemp := Item.DisplayRect(drBounds);  rCettemp.Left := rCettemp.Left +
        ListView_GetColumnWidth(ListView1.Handle, 0) + 5;
      rCettemp.Right := rCettemp.Left +
        ListView_GetColumnWidth(ListView1.Handle, 1) - 10;
    // 这里是关键,如果用ListView1.columns[N].Width并不是实时的  if EqualRect(pan.BoundsRect, rCettemp) then Exit; // 无变化,就别处理
      pan.BoundsRect := rCettemp;
    end;