Avant de regarder le code, je vous joins un rendu :
Sans plus tarder, je vais juste poster le code pour vous.
unité Unit1;interfaceutiliseWindows, Messages, SysUtils, Variants, Classes, Graphiques, Contrôles, Formulaires,Dialogs, StdCtrls, ComCtrls, ImgList;typeTForm1 = class(TForm)btn1: TButton;lv1: TListView;trckbr1: TTrackBar;il1: TImageList;procedure lv1CustomDraw (Expéditeur : TCustomListView ; const ARect : TRect ; var DefaultDraw : Boolean); procédure lv1CustomDrawItem (Expéditeur : TCustomListView ; Élément : TListItem ; État : TCustomDrawState ; var DefaultDraw : Boolean); TObject);privatefunction ReDrawItem(HwndLV: HWND; ItemIndex: integer): boolean;{ Déclarations privées }public{ Déclarations publiques }end;varForm1: TForm1;implementationusesCommCtrl;{$R *.dfm}//Procédure de barre d'état de dessin DrawSubItem(LV : TListView Élément : TListItem ; Sous-élément : Entier ; Prosition : Single ; Max, Style : Integer ; IsShowProgress : Boolean ; DrawColor : TColor = $00005B00 ; FrameColor : TColor = $00002F00 );//Obtenir la fonction de zone de SubItem GetItemRect(hWndLV : HWnd ; iItem, iSubItem : Integer) : TRect ;varRect : 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) et (not IsShowProgress ) thenCanvas.FillRect(r) //Si c'est 0 , affichez directement le blanc elsebegin//Remplissez d'abord l'arrière-plan Canvas.FillRect(r);Canvas.Brush.Color:= Color;//Dessinez un cadre extérieurInflateRect(R, -2, -2);Canvas.Brush.Color: = FrameColor;Canvas.FrameRect(R);Canvas.Brush.Color := Couleur;InflateRect(R, -1, -1);//InflateRect(R,-1,-1);//Calculez l'aperçu du contenu de la barre de progression en fonction du pourcentage 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: //Le remplissage de la ligne verticale commencei := 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//Après avoir dessiné la barre de progression, il ne vous reste plus qu'à afficher le numéro de progression. Canvas.Brush.Style := bsClear;if Prosition = Round(Prosition) thenS := Format('%d%%', [Round(Prosition) )])elseS := FormatFloat('#0.0', Prosition);avec PaintRect dobeginx := Gauche + (Droite - Gauche + 1 - Canvas.TextWidth(S)) div 2;y := Haut + (Bas - Haut + 1 - Canvas.TextHeight(S)) div 2;end;SetBkMode(Canvas.Handle, TRANSPARENT);Canvas.TextRect(PaintRect, x , y, S);end;//Restaurer après avoir peint Canvas.Brush.Color := Color;end;end;procedure TForm1.lv1CustomDraw(Sender: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean);beginend;//Ce qui précède consiste à dessiner la barre de progression. Nous devons maintenant traiter le message de redessinage de l'élément pour TlistView. Il faut expliquer que si vous souhaitez dessiner vos propres éléments comme vous le souhaitez, vous devez tout faire vous-même et vous n'avez plus besoin du système pour le gérer : procédure TForm1.lv1CustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);varBoundRect, Rect: TRect;i: integer;TextFormat: Word;LV: TListView; //Ce sous-processus est utilisé pour dessiner Procédure de CheckBox et ImageList Draw_CheckBox_ImageList(r: TRect; aCanvas: TCanvas; Checked: Boolean);varR1: TRect;i: Integer;beginif Sender.Checkboxes thenbeginaCanvas.Pen.Color := clBlack;aCanvas.Pen.Width := 2;//Dessinez le cadre extérieur de CheckBox aCanvas. Rectangle (R.Gauche + 2, R.Haut + 2, R.Gauche + 14, R.Bottom - 2);si coché alors //Dessinez le crochet de CheckBoxbeginCanvas.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;//Commencer à dessiner l'icône i := 2; //La valeur de ImageIndex peut être arbitraire si i > -1 thenbegin//Obtenir le RECT de l'icône si Boolean(ListView_GetSubItemRect(sender.Handle, item.Index, 0, LVIR_ICON, @R1)) puis commencer//ImageList_Stats.Draw(LV.Canvas, R1.Left, R1.Top, i);si 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);//Vous pouvez définir cet endroit sur la couleur souhaitée en fonction de vos propres besoins pour obtenir la mise en surbrillance LV.Canvas.Font.Color := clBtnText;//Vérifiez s'il est sélectionné si Item.Selected thenbeginif cdsFocused in 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) ; // Initialise l'arrière-plan pour i := 0 à LV.Columns.Count - 1 dobegin//Obtenez le 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: //Dessiner la légende, 0 signifie Légende, pas Subitembegin//Dessiner d'abord la zone de sélection et l'icône Draw_CheckBox_ImageList(BoundRect, LV.Canvas, Item.Checked);//Puis dessiner la légende TextInflateRect(Rect, -(5 + il1.Width), 0); //Reculez de 3 pixels pour éviter d'être écrasé lorsque le filaire est dessiné ultérieurement //InflateRect(Rect, -(5), 0); //Reculez de 3 pixels pour éviter d'être écrasé lorsque le filaire est dessiné ultérieurement DrawText( LV. Canvas.Handle, PAnsiChar(Item.Caption), Longueur(Item.Caption), Rect, DT_VCENTER ou DT_SINGLELINE ou DT_END_ELLIPSIS ou TextFormat);end;1..MaxInt: //Draw SubItem[i]beginif (i - 1) = 1 then //Affiche la barre d'état, cet exemple est l'affichage de la troisième colonne, vous pouvez personnaliser beginDrawSubItem(LV, Item, je , StrToFloatDef(Item.SubItems[i - 1], 0), 100, 0, True);endelsebegin//Dessinez le texte de SubItemInflateRect(Rect, -2, -2);if i - 1 <= Item.SubItems.Count - 1 thenDrawText(LV.Canvas.Handle, PCHAR(Item.SubItems[i - 1]), Longueur(Item.SubItems[i - 1]), Rect, DT_VCENTER ou DT_SINGLELINE ou DT_END_ELLIPSIS ou TextFormat);end;end;end; //end caseend; //end forLV.Canvas.Brush.Color := clWhite;if Item.Selected then //Dessine le contour de la barre sélectionnée startif cdsFocused in State then/ /Si le contrôle est actif LV.Canvas.Brush.Color := $00DAA07A // $00E2B598; //clHighlight;elseLV.Canvas.Brush.Color := $00E2B598; //$00DAA07A //clHighlight;LV.Canvas.FrameRect(BoundRect); //end;DefaultDraw := False; avec Sender.Canvas doif Assigned(Font.OnChange) thenFont.OnChange(Font);end;function TForm1.ReDrawItem(HwndLV: HWND; ItemIndex: entier): boolean;beginResult := ListView_RedrawItems(HwndLV, ItemIndex, ItemIndex);end;procedure TForm1.btn1Click(Sender: TObject);varItem: TListItem;begin//Use: item: = LV1.Items[1];if Item = nil thenExit;item.subitems[1] := '30'; //Défini sur 30%//Puis actualiser cet itemReDrawItem(LV1.handle, Item.Index);end;procedure TForm1.trckbr1Change(Expéditeur : TObject);varItem : TListItem;begin//Utilisation : item := LV1.Items[0];item.subitems[1] := IntToStr(trckbr1.Position);//Puis actualisez cet itemReDrawItem(LV1.handle, Item.Index);end;end objet Form1 : TForm1Left = 416Top = 301Width = 494Hauteur = 170Légende = 'Form1'Couleur = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'MS Sans Serif'Font.Style = []OldCreateOrder = FalsePixelsPerInch = 96TextHeight = 13object btn1 : TButtonLeft = 272Top = 96Width = 75Hauteur = 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 il1 : TImageListLeft = 384Top = 96Bitmap = {