2013-10-14 1 views

답변

2

ListBox를 소유자 드로잉해야합니다. Style 속성을 lbOwnerDraw, lbOwnerDrawVariable 또는 lbVirtualOwnerDraw으로 설정 한 다음 OnDrawItem 이벤트를 사용하여 원하는 항목을 그리십시오 (lbOwnerDrawVariable의 경우 OnMeasureItem 이벤트 처리기도 제공해야 함). 어떤 항목을 두 번 클릭했는지 추적해야하며, 그런 다음 해당 항목을 다른 항목과 다르게 그릴 수 있습니다. 예를 들면 :

type 
    MyItem = record 
    Text: String; 
    DblClicked: Boolean; 
    end; 

MyItems: array of MyItem; 

var 
    Item: MyItem; 
begin 
    SetLength(MyItems, ...); 

    MyItems[0].Text := 'Item Text'; 
    MyItems[0].DblClicked := False; 

    ... 

    for Item in MyItems do 
    ListBox1.Items.Add(Item.Text); 
end; 

procedure TForm1.ListBox1DblClick(Sender: TObject); 
var 
    Pos: DWORD; 
    Pt: TPoint; 
    Index: Integer; 
begin 
    Pos := GetMessagePos; 
    Pt.X := Smallint(LOWORD(Pos)); 
    Pt.Y := Smallint(HIWORD(Pos)); 
    Index := ListBox1.ItemAtPos(ListBox1.ScreenToClient(Pt), True); 
    if Index <> -1 then 
    begin 
    MyItems[Index].DblClicked := True; 
    ListBox1.Invalidate; 
    end; 
end; 

procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); 
begin 
    if MyItems[Index].DblClicked then 
    begin 
    ListBox1.Canvas.Brush.Color := clRed; 
    ListBox1.Canvas.Font.Color := clWhite; 
    end else 
    begin 
    ListBox1.Canvas.Brush.Color := ListBox1.Color; 
    ListBox1.Canvas.Font.Color := ListBox1.Font.Color; 
    end; 
    ListBox1.Canvas.FillRect(Rect); 
    ListBox1.Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2, MyItems[Index].Text); 
end; 
+0

하지만 그것은 OnDblClick 이벤트해야합니다. 예를 들어 주시겠습니까? – Gab

+0

'OnDblClick' 이벤트는 색상을 직접 변경할 수는 없지만 두 번 클릭 한 항목을 추적하는 데 사용할 수 있으며 다시 그리기를 트리거하기 위해 ListBox를'무효화 (') 할 수 있으며'OnDrawItem' even 필요에 따라 다른 색상을 사용하여 현재 추적 된 두 번 클릭 된 항목을 그릴 수 있습니다. –

+0

추적을 위해 무엇을 제안 하시겠습니까? – Gab