Delphi - 在ListView中添加一个进度条

// 相关定义
Type
  TListData = Record
    FileName: String;
    Percent: Integer;
  End;

  PListData = ^TListData;

  // 需要Use CommCtrl
Function GetSubItemRect(handle, ItemsIndex, SubIndex: Integer): TRect;
Begin
  ListView_GetSubItemRect(handle, ItemsIndex, SubIndex, 0, @Result);
End;

Procedure TFormMain.lvw_listCustomDrawSubItem(Sender: TCustomListView; Item: TListItem; SubItem: Integer;
  State: TCustomDrawState; Var DefaultDraw: Boolean);
Var
  l_Rect: TRect;
  l_intPercent: Integer;
Begin
  If SubItem = 3 Then
  Begin
    If Item.Data = Nil Then
      Exit;
    l_intPercent := PListData(Item.Data).Percent;
    // 获取ListView子项的Rect
    l_Rect := GetSubItemRect(Item.handle, Item.Index, SubItem);
    // 画一条外边框
    InflateRect(l_Rect, -1, -1);
    Sender.Canvas.Brush.Color := clBlack;
    Sender.Canvas.FrameRect(l_Rect);
    // 先填充底色
    InflateRect(l_Rect, -1, -1);
    Sender.Canvas.Brush.Color := lvw_list.Color;
    Sender.Canvas.FillRect(l_Rect);
    // 再根据进度画出完成区域
    If l_intPercent = 100 Then
      Sender.Canvas.Brush.Color := clGreen
    Else
      Sender.Canvas.Brush.Color := clPurple;
    l_Rect.Right := l_Rect.Left + Floor((l_Rect.Right - l_Rect.Left) * l_intPercent / 100);
    Sender.Canvas.FillRect(l_Rect);
    // 恢复笔刷
    Sender.Canvas.Brush.Color := lvw_list.Color;
    // 关键的一句,屏蔽系统自绘过程
    DefaultDraw := False;
  End;
End;

// 本文来自CSDN博客,转载请标明出处:http: //blog.csdn.net/kwbin/archive/2008/11/26/3381317.aspx