Прежде чем посмотреть код, я приложу вам рендеринг:
Без лишних слов, я просто опубликую для вас код.
unit Unit1;interfaceusesWindows, Messages, SysUtils, Варианты, Классы, Графика, Элементы управления, Формы, Диалоги, StdCtrls, ComCtrls, ImgList;typeTForm1 = class(TForm)btn1: TButton;lv1: TListView;trckbr1: TTrackBar;il1: TImageList;процедура lv1CustomDraw(Отправитель: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean); процедура lv1CustomDrawItem (Отправитель: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean); процедура btn1Click (Sender: TObject); процедура trckbr1Change (Sender: TObject);privatefunction ReDrawItem(HwndLV: HWND; ItemIndex: целое число): boolean;{ Частные объявления }public{ Публичные объявления }end;varForm1: TForm1;implementationusesCommCtrl;{$R *.dfm}//Процедура отображения строки состояния DrawSubItem(LV) : Элемент TListView: Подэлемент: Целое число; Prosition: Single; Max, Style: Integer; IsShowProgress: Boolean; DrawColor: TColor = $00005B00; FrameColor: TColor = $00002F00);//Получаем функцию области SubItem GetItemRect(hWndLV: HWnd; iItem, iSubItem: Integer): TRect ;варРект: TRect;beginListView_GetSubItemRect(hWndLV, iItem, iSubItem, iSubItem, @Rect);Result := Rect;end;varPaintRect, R: TRect;i, iWidth, x, y: Integer;S: string;beginwith lv dobeginPaintRect := GetItemRect( lv.Handle, Item.Index, SubItem);R := PaintRect;if Prosition >= Max thenProsition := 100elsebeginif Prosition <= 0 thenProsition := 0elseProsition := Round((Prosition / MAX) * 100);end;if (Prosition = 0) и (не IsShowProgress ) thenCanvas.FillRect(r) //Если это 0 , непосредственно отображаем пустое elsebegin//Сначала заполняем фон Canvas.FillRect(r);Canvas.Brush.Color:= Color;//Рисуем внешнюю рамкуInflateRect(R, -2, -2);Canvas.Brush.Color: = FrameColor;Canvas.FrameRect(R);Canvas.Brush.Color := Color;InflateRect(R, -1, -1);//InflateRect(R,-1,-1);//Рассчитать обзор содержимого индикатора выполнения на основе процентного соотношения iWidth := R.Right - Round((R.Right - R.Left) * ( ( 100 - Prosition) / 100));case Style of0: //Solid BeginCanvas.Brush.Color := DrawColor;R.Right := iWidth;Canvas.FillRect(R);end;1: //Заполнение вертикальной линии Begini := r.Left; while i < iWidth dobeginCanvas.Pen.Color := Color;Canvas.MoveTo(i, R.Top);Canvas .Pen.Color := DrawColor;Canvas.LineTo(i, R.Bottom);Inc(i, 3);end;end;end; //case; end//После рисования индикатора выполнения все, что вам нужно сделать, это отобразить номер прогресса Canvas.Brush.Style := bsClear;if Prosition = Round(Prosition) thenS := Format('%d%%', [Round(Prosition) )])elseS := FormatFloat('#0.0', Prosition);with PaintRect dobeginx := Left + (Right - Left + 1 - Canvas.TextWidth(S)) div 2;y := Верх + (Низ - Верх + 1 - Canvas.TextHeight(S)) div 2;end;SetBkMode(Canvas.Handle, TRANSPARENT);Canvas.TextRect(PaintRect, x , y, S);end;//Восстановить после рисования Canvas.Brush.Color := Color;end;end;procedure TForm1.lv1CustomDraw(Sender: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean);beginend;//Вышеуказанное предназначено для рисования индикатора выполнения. Теперь нам нужно обработать сообщение о перерисовке элемента для TlistView. Это событие OnCustomDrawItem. Необходимо объяснить, что если вы хотите рисовать свои собственные элементы так, как вам нравится, вам придется делать все это самостоятельно, и вам больше не нужна система, чтобы справиться с этим: процедура TForm1.lv1CustomDrawItem(Отправитель: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);varBoundRect, Rect: TRect;i: целое число;TextFormat: Word;LV: TListView; //Этот подпроцесс используется для рисования; Процедура CheckBox и ImageList Draw_CheckBox_ImageList(r: TRect; aCanvas: TCanvas; Checked: Boolean);varR1: TRect;i: Integer;beginif Sender.Checkboxes thenbeginCanvas.Pen.Color := clBlack;aCanvas.Pen.Width := 2;//Нарисуйте внешнюю рамку CheckBox aCanvas. Прямоугольник (П.Левый + 2, П.Верх + 2, П.Левый + 14, R.Bottom - 2); если отмечено, то //Рисуем крючок CheckBox BeginCanvas.MoveTo(R.Left + 4, R.Top + 6);aCanvas.LineTo(R.Left + 6, R.Top + 11) ; aCanvas.LineTo(R.Left + 11, R.Top + 5);end;aCanvas.Pen.Width := 1;end;//Начать рисование значка i := 2; //Значение ImageIndex может быть произвольным, если i > -1 thenbegin//Получить RECT значка if Boolean(ListView_GetSubItemRect(sender.Handle, item.Index, 0, LVIR_ICON, @R1)) thenbegin//ImageList_Stats.Draw(LV.Canvas, R1.Left, R1.Top, i);if item.ImageIndex > -1 thenLV.SmallImages.Draw(LV.Canvas, R1.Right + 2, R1.Top, item.ImageIndex);end;end;end;beginLV := TListView(Sender);BoundRect := Item.DisplayRect(drBounds);InflateRect(BoundRect, -1, 0);//Вы можете установить для этого места желаемый цвет в соответствии с вашими собственными требованиями, чтобы добиться подсветки LV.Canvas.Font.Color := clBtnText;//Проверьте, выбрано ли оно, если Item.Selected thenbeginif cdsFocused в State thenbeginLV. Canvas.Brush.Color := $00ECCCB9 // //clHighlight;endelsebeginLV.Canvas.Brush.Color :=; $00F8ECE5; //clSilver;end;endelsebeginif (Item.Index mod 2) = 0 thenLV.Canvas.Brush.Color := clWhiteelseLV.Canvas.Brush.Color := $00F2F2F2;end;LV.Canvas.FillRect(BoundRect) ; // Инициализируем фон для i := 0 до LV.Columns.Count - 1 dobegin//Получить RectListView_GetSubItemRect(LV.Handle, Item.Index, i, LVIR_LABEL, @Rect);case LV.Columns[i].Alignment oftaLeftJustify:TextFormat := DT_LEFT;taRightJustify:TextFormat := DT_RIGHT;taCenter:TextFormat : = DT_CENTER;elseTextFormat := DT_CENTER;end;case i of0: //Нарисовать заголовок, 0 означает заголовок, а не начало подэлемента//Сначала нарисуйте поле выбора и значок Draw_CheckBox_ImageList(BoundRect, LV.Canvas, Item.Checked);//Затем нарисуйте заголовок TextInflateRect(Rect, -(5 + il1.Width), 0); //Перемещаемся на 3 пикселя назад, чтобы избежать перезаписи при последующем отрисовке каркаса //InflateRect(Rect, -(5), 0 //Перемещаемся на 3 пикселя назад, чтобы избежать перезаписи при последующем отрисовке каркаса DrawText( LV. Canvas.Handle, PAnsiChar(Item.Caption), Длина(Item.Caption), Rect, DT_VCENTER или DT_SINGLELINE или DT_END_ELLIPSIS или TextFormat);end;1..MaxInt: //Рисование SubItem[i]beginif (i - 1) = 1 then //Отображение строки состояния, этот пример представляет собой отображение третьего столбца, вы можете настроить BeginDrawSubItem(LV, Item, i , StrToFloatDef(Item.SubItems[i - 1], 0), 100, 0, True);endelsebegin//Нарисовать текст SubItemInflateRect(Rect, -2, -2);if i - 1 <= Item.SubItems.Count - 1 thenDrawText(LV.Canvas.Handle, PCHAR(Item.SubItems[i - 1]), Длина(Item.SubItems[i - 1]), Rect, DT_VCENTER или DT_SINGLELINE или DT_END_ELLIPSIS или TextFormat);end;end;end; //конец случаяend; //конец forLV.Canvas.Brush.Color := clWhite;if Item.Selected then //Нарисуйте контур выбранной полосы Beginif cdsFocused в состоянии then/ /Активен ли элемент управления LV.Canvas.Brush.Color := $00DAA07A // $00E2B598; //clHighlight;elseLV.Canvas.Brush.Color := $00E2B598; //$00DAA07A // clHighlight;LV.Canvas.FrameRect(BoundRect); //end;DefaultDraw := False; //Не разрешать системе рисовать. с Sender.Canvas doif Assigned(Font.OnChange) thenFont.OnChange(Font);end;function TForm1.ReDrawItem(HwndLV: HWND; ItemIndex: целое число): boolean;beginResult := ListView_RedrawItems(HwndLV, ItemIndex, ItemIndex);end;procedure TForm1.btn1Click(Sender: TObject);varItem: TListItem;begin//Использовать: item: = LV1.Items[1];if Item = nil thenExit;item.subitems[1] := '30' //Установить на 30%//Затем обновить этот элементReDrawItem(LV1.handle, Item.Index);end;procedure TForm1.trckbr1Change(Отправитель: TObject);varItem: TListItem;begin//Использовать: элемент := LV1.Items[0];item.subitems[1] := IntToStr(trckbr1.Position);//Затем обновите этот элементReDrawItem(LV1.handle, Item.Index);end;end. object Form1: TForm1Left = 416Top = 301Width = 494Height = 170Caption = 'Form1'Color = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'MS Sans Serif'Font.Style = []OldCreateOrder = FalsePixelsPerInch = 96TextHeight = 13object btn1: TButtonLeft = 272Top = 96Width = 75Height = 25Caption = 'btn1'TabOrder = 0OnClick = btn1Clickendobject lv1: TListViewLeft = 16Top = 8Width = 457Height = 81Columns = <itemCaption = 'Name'Width = 100enditemCaption = 'Category'Width = 100enditemCaption = 'Progress'Width = 100enditemCaption = 'Resource'Width = 100end>GridLines = TrueItems.Data = {5B000000020000000200000000000000FFFFFFFF02000000000000006B4F3B8BBCECC04D3CECFB70333354D01000000F FFFFFFFFFFFFFFF020000000000000008446F7461B4ABC6E604D3CECFB7043130304DFFFFFFFFFFFFFFFF}ShowWorkAreas ил1: TImageListLeft = 384Top = 96Bitmap = {