Sebelum melihat kodenya, saya akan melampirkan rendering untuk Anda:
Tanpa basa-basi lagi, saya hanya akan memposting kodenya untuk Anda.
unit Unit1;antarmukamenggunakanWindows, Pesan, SysUtils, Varian, Kelas, Grafik, Kontrol, Formulir,Dialog, StdCtrls, ComCtrls, ImgList;typeTForm1 = class(TForm)btn1: TButton;lv1: TListView;trckbr1: TTrackBar;il1: TImageList;procedure lv1CustomDraw(Pengirim: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean); prosedur lv1CustomDrawItem(Pengirim: TCustomListView; Item: TListItem; Status: TCustomDrawState; var DefaultDraw: Boolean); TObject);privatefunction ReDrawItem(HwndLV: HWND; ItemIndex: integer): boolean;{ Deklarasi pribadi }public{ Deklarasi publik }end;varForm1: TForm1;implementationusesCommCtrl;{$R *.dfm}//Menggambar prosedur bilah status DrawSubItem(LV : TListView; Barang: TListItem; Prosisi: Tunggal; Maks, Gaya: Integer; IsShowProgress: Boolean; DrawColor: TColor = $00005B00; FrameColor: TColor = $00002F00);//Dapatkan fungsi area dari SubItem GetItemRect(hWndLV: HWnd; iItem, iSubItem: Integer): BENAR ;varRect: TRect;beginListView_GetSubItemRect(hWndLV, iItem, iSubItem, iSubItem, @Rect);Hasil := Rect;end;varPaintRect, R: TRect;i, iWidth, x, y: Integer;S: string;beginwith lv dobeginPaintRect := GetItemRect( lv.Handle, Item.Indeks, SubItem);R := PaintRect;if Prosition >= MaxthenProsition := 100elsebeginif Prosition <= 0thenProsition := 0elseProsition := Round((Prosition / MAX) * 100);end;if (Prosition = 0) dan (bukan IsShowProgress ) kemudianCanvas.FillRect(r) //Jika 0 , langsung tampilkan bagian yang kosong elsebegin//Isi latar belakang terlebih dahulu Canvas.FillRect(r);Canvas.Brush.Color:= Warna;//Gambar bingkai luarInflateRect(R, -2, -2);Canvas.Brush.Color: = FrameColor;Canvas.FrameRect(R);Canvas.Brush.Color := Warna;InflateRect(R, -1, -1);//InflateRect(R,-1,-1);//Hitung ikhtisar konten bilah kemajuan berdasarkan persentase 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: //Pengisian garis vertikal mulai := r.Left;sementara 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; end//Setelah menggambar bilah kemajuan, yang perlu Anda lakukan sekarang adalah menampilkan nomor kemajuan. Canvas.Brush.Style := bsClear;if Prosition = Round(Prosition)thenS := Format('%d%%', [Round(Prosition) )])elseS := FormatFloat('#0.0', Prosition);dengan dobeginx PaintRect := Kiri + (Kanan - Kiri + 1 - Canvas.TextWidth(S)) div 2;y := Atas + (Bawah - Atas + 1 - Canvas.TextHeight(S)) div 2;end;SetBkMode(Canvas.Handle, TRANSPARAN);Canvas.TextRect(PaintRect, x , y, S);end;//Pulihkan setelah melukis Canvas.Brush.Color := Warna;akhir;akhir;prosedur TForm1.lv1CustomDraw(Sender: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean);beginend;//Di atas adalah untuk menggambar bilah kemajuan. Sekarang kita perlu memproses pesan menggambar ulang Item untuk TlistView Perlu dijelaskan bahwa, Jika anda ingin menggambar item sendiri sesuka anda, maka anda harus melakukan semuanya sendiri dan tidak memerlukan lagi sistem untuk menanganinya: prosedur TForm1.lv1CustomDrawItem(Pengirim: TCustomListView; Item: TListItem; Status: TCustomDrawState; var DefaultDraw: Boolean);varBoundRect, Rect: TRect;i: integer;TextFormat: Word;LV: TListView; //Sub-proses ini digunakan untuk menggambar Prosedur CheckBox dan ImageList Draw_CheckBox_ImageList(r: TRect; aCanvas: TCanvas; Dicentang: Boolean);varR1: TRect;i: Integer;beginif Sender.Checkboxes lalubeginaCanvas.Pen.Color := clBlack;aCanvas.Pen.Width := 2;//Gambar bingkai luar Kotak Centang aCanvas. Persegi Panjang (R.Kiri + 2, R.Atas + 2, R.Kiri + 14, R.Bottom - 2);jika dicentang maka //Gambar kait CheckBox BeginCanvas.MoveTo(R.Left + 4, R.Top + 6);aCanvas.LineTo(R.Left + 6, R.Top + 11) ; 1;end;//Mulai menggambar ikon i := 2; //Nilai ImageIndex bisa berubah-ubah jika i > -1 lalu mulai//Dapatkan RECT dari ikon jika Boolean(ListView_GetSubItemRect(sender.Handle, item.Index, 0, LVIR_ICON, @R1)) lalu mulai//ImageList_Stats.Draw(LV.Canvas, R1.Left, R1.Top, i);jika item.ImageIndex > -1 makaLV.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);//Anda dapat mengatur tempat ini ke warna yang diinginkan sesuai dengan kebutuhan Anda sendiri untuk mencapai penyorotan LV.Canvas.Font.Color := clBtnText;//Periksa apakah dipilih jika Item.Selected lalu mulai jika cdsFocused in State lalu mulai LV. Kanvas.Kuas.Warna := $00ECCCB9; // //clHighlight;endelsebeginLV.Kanvas.Kuas.Warna := $00F8ECE5; //clSilver;end;endelsebeginif (Item.Index mod 2) = 0 laluLV.Canvas.Brush.Color := clWhiteelseLV.Canvas.Brush.Color := $00F2F2F2;end;LV.Canvas.FillRect(BoundRect) ; // Inisialisasi latar belakang untuk i := 0 hingga LV.Columns.Count - 1 dobegin//Dapatkan RectListView_GetSubItemRect(LV.Handle, Item.Index, i, LVIR_LABEL, @Rect);case LV.Columns[i].Penjajaran taLeftJustify:TextFormat := DT_LEFT;taRightJustify:TextFormat := DT_RIGHT;taCenter:TextFormat : = DT_CENTER;elseTextFormat := DT_CENTER;end;case i of0: //Gambar Caption, 0 berarti Caption, bukan Subitembegin//Gambar terlebih dahulu kotak pilihan dan icon Draw_CheckBox_ImageList(BoundRect, LV.Canvas, Item.Checked);//Kemudian gambar Caption TextInflateRect(Rect, -(5 + il1.Width), 0); //Mundurkan 3 piksel agar tidak tertimpa saat wireframe digambar nanti //InflateRect(Rect, -(5), 0); //Pindahkan 3 piksel ke belakang untuk menghindari tertimpa saat wireframe digambar nanti DrawText( LV. Canvas.Handle, PAnsiChar(Item.Caption), Panjang(Item.Caption), Rect, DT_VCENTER atau DT_SINGLELINE atau DT_END_ELLIPSIS atau TextFormat);end;1..MaxInt: //Draw SubItem[i]beginif (i - 1) = 1 lalu //Tampilkan status bar, contoh ini adalah tampilan kolom ketiga, Anda dapat mengkustomisasi BeginDrawSubItem(LV, Item, i , StrToFloatDef(Item.SubItem[i - 1], 0), 100, 0, Benar);endelsebegin//Gambar teks SubItemInflateRect(Rect, -2, -2);jika i - 1 <= Item.SubItems.Count - 1 makaDrawText(LV.Canvas.Handle, PCHAR(Item.SubItems[i - 1]), Panjang(Item.SubItems[i - 1]), Persegi, DT_VCENTER atau DT_SINGLELINE atau DT_END_ELLIPSIS atau TextFormat);end;end;end; //end caseend; //end forLV.Canvas.Brush.Color := clWhite;jika Item.Dipilih maka //Gambar garis luar batang yang dipilih dimulaijika cdsFokus pada Status lalu/ /Apakah kontrol aktif LV.Canvas.Brush.Color := $00DAA07A // $00E2B598; //clHighlight;elseLV.Canvas.Brush.Color := $00E2B598; //$00DAA07A // clHighlight;LV.Canvas.FrameRect(BoundRect); //end;DefaultDraw := False; dengan Sender.Canvas doif Ditugaskan(Font.OnChange) laluFont.OnChange(Font);end;fungsi TForm1.ReDrawItem(HwndLV: HWND; ItemIndex: integer): boolean;beginResult := ListView_RedrawItems(HwndLV, ItemIndex, ItemIndex);end;prosedur TForm1.btn1Click(Sender: TObject);varItem: TListItem;begin//Gunakan: item: = LV1.Items[1];if Item = nihil laluKeluar;item.subitems[1] := '30'; //Setel ke 30%//Kemudian segarkan itemReDrawItem(LV1.handle, Item.Index);end;procedure ini TForm1.trckbr1Change(Pengirim: TObject);varItem: TListItem;begin//Gunakan: item := LV1.Items[0];item.subitems[1] := IntToStr(trckbr1.Position);//Kemudian segarkan itemReDrawItem(LV1.handle, Item.Index);end;end objek ini: TForm1Left = 416Top = 301Width = 494Tinggi = 170Caption = 'Bentuk1'Warna = clBtnFaceFont.Charset = DEFAULT_CHARSETFont.Color = clWindowTextFont.Height = -11Font.Name = 'MS Sans Serif'Font.Style = []OldCreateOrder = FalsePixelsPerInch = 96TextHeight = 13objek btn1: TButtonLeft = 272Top = 96Width = 75Tinggi = 25Caption = 'btn1'TabOrder = 0OnClick = btn1Clickendobject lv1: TListViewLeft = 16Top = 8Width = 457Tinggi = 81Columns = <itemCaption = 'Nama'Lebar = 100enditemCaption = 'Kategori'Lebar = 100enditemCaption = 'Progress'Width = 100enditemCaption = 'Resource'Width = 100end>GridLines = TrueItems.Data = {5B000000020000000200000000000000FFFFFFFF02000000000000006B4F3B8BBCECC04D3CECFB70333354D01000000F FFFFFFFFFFFFFFF020000000000000008446F7461B4ABC6E604D3CECFB7043130304DFFFFFFFFFFFFFFFFFF}TampilkanArea Kerja il1: TImageListLeft = 384Top = 96Bitmap = {