코드를 보기 전에 렌더링을 첨부하겠습니다.
더 이상 고민하지 않고 코드를 게시해 드리겠습니다.
단위 Unit1;인터페이스사용Windows, 메시지, SysUtils, 변형, 클래스, 그래픽, 컨트롤, 양식, 대화 상자, StdCtrls, ComCtrls, ImgList;typeTForm1 = 클래스(TForm)btn1: TButton;lv1: TListView;trckbr1: TTrackBar;il1: TImageList;프로시저 lv1CustomDraw(보내는 사람: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean); 프로시저 lv1CustomDrawItem(Sender: TCustomListView; 항목: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean) 프로시저 btn1Click(Sender: TObject); TObject);privatefunction ReDrawItem(HwndLV: HWND; ItemIndex: 정수): boolean;{ 비공개 선언 }public{ 공개 선언 }end;varForm1: TForm1;implementationusesCommCtrl;{$R *.dfm}//도면 상태 표시줄 프로시저 DrawSubItem(LV : TListView; 항목: TListItem: 정수; Prosition: Single; Max, Style: Integer; Boolean; DrawColor: TColor = $00005B00; FrameColor: TColor = $00002F00);//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.핸들, 아이템.인덱스, SubItem);R := PaintRect;if Prosition >= Max thenProsition := 100elsebeginif Prosition <= 0 thenProsition := 0elseProsition := Round((Prosition / MAX) * 100);end;if (Prosition = 0) and (IsShowProgress 아님 ) thenCanvas.FillRect(r) //0인 경우 , 빈 항목을 직접 표시합니다. elsebegin//배경을 먼저 채웁니다. Canvas.FillRect(r);Canvas.Brush.Color:= Color;//외부 프레임 그리기InflateRect(R, -2, -2);Canvas.Brush.Color: = 프레임색상;Canvas.FrameRect(R);Canvas.Brush.Color := 색상;InflateRect(R, -1, -1);//InflateRect(R,-1,-1);//백분율을 기준으로 진행률 표시줄 콘텐츠 개요를 계산합니다. iWidth := R.Right - Round((R.Right - R.Left) * ( ( 100 - Prosition) / 100));case 스타일 0: //Solid startCanvas.Brush.Color := DrawColor;R.Right := iWidth;Canvas.FillRect(R);end;1: //세로선 채우기 starti := 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; end//진행률 표시줄을 그린 후 지금 해야 할 일은 진행률 번호를 표시하는 것뿐입니다. Canvas.Brush.Style := bsClear;if Prosition = Round(Prosition) thenS := Format('%d%%', [Round(Prosition) )])elseS := FormatFloat('#0.0', Prosition);with PaintRect dobeginx := 왼쪽 + (오른쪽 - 왼쪽 + 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에 대한 항목 다시 그리기 메시지를 처리해야 합니다. 원하는 대로 자신만의 항목을 그리려면 모든 작업을 직접 수행해야 하며 더 이상 처리할 시스템이 필요하지 않다는 점을 설명해야 합니다. 절차 TForm1.lv1CustomDrawItem(Sender: 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 thenbeginaCanvas.Pen.Color := clBlack;aCanvas.Pen.Width := 2;//CheckBox 외부 프레임 aCanvas를 그립니다. 직사각형(R.왼쪽 + 2, R.위쪽 + 2, R.왼쪽 + 14, R.Bottom - 2); 체크된 경우 //CheckBox의 후크를 그립니다. startCanvas.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; //i > -1인 경우 ImageIndex 값은 임의적일 수 있습니다. 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인 경우 선택되었는지 확인한 다음 cdsFocused in State인 경우 시작됩니다.LV를 시작합니다. Canvas.Brush.Color := $00ECCCB9; // //clHighlight;endelsebeginLV.Canvas.Brush.Color := $00F8ECE5; //clSilver;end;endelsebeginif (Item.Index 모드 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), Length(Item.Caption), Rect, DT_VCENTER 또는 DT_SINGLELINE 또는 DT_END_ELLIPSIS 또는 TextFormat);end;1..MaxInt: //Draw 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 caseend; //end forLV.Canvas.Brush.Color := clWhite;if Item.Selected then //선택한 막대 외곽선을 그리기 시작합니다.if cdsFocused in State 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//Use: item: = LV1.Items[1];if Item = nil thenExit;item.subitems[1] := '30'; //30%로 설정//이 항목을 새로 고칩니다ReDrawItem(LV1.handle, Item.Index);end;procedure TForm1.trckbr1Change(Sender: TObject);varItem: TListItem;begin//Use: item := LV1.Items[0];item.subitems[1] := IntToStr(trckbr1.Position);//이 항목을 새로 고칩니다ReDrawItem(LV1.handle, Item.Index);end;end 개체 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 il1: TImageListLeft = 384Top = 96Bitmap = {