Извините, не могу прокомментировать как отключить горячее отслеживание в Delphi ListView?, я начинаю новый вопрос.
Следуя совету по ссылке выше, но когда я нажимаю на текст заголовка, список выглядит следующим образом:
Я установил brush.color в drawItem и drawSubItem каждой строки:
Sender.Canvas.Brush.Color := mycolor
Но если я нажму на текст подписи, то в области подписи только текстовая часть будет иметь цветной фон.
Код: (Рабочая среда: XE6, Win8.1)
TMyTaskListView = class(TListView)
protected
procedure CreateWnd; override;
end;
procedure TMyTaskListView.CreateWnd;
begin
inherited;
SetWindowTheme(WindowHandle, nil, nil);
end;
var
ListView1: TMyTaskListView;
Form.createForm:
ListView1.Columns.Add.Caption := 'TaskNo';
ListView1.Columns.Add.Caption := 'Task1';
ListView1.Columns.Add.Caption := 'Task2';
ListView1.Columns.Add.Caption := 'Task3';
ListView1.Columns.Add.Caption := 'Task Status';
ListView1.Items.Count := 5;
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
Item.Caption := IntToStr(Item.Index);
Item.SubItems.Add('done');
Item.SubItems.Add('error');
Item.SubItems.Add('error');
Item.SubItems.Add('error');
end;
procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if lstTaskItemCurClickBackgroundIndex = Item.Index then
Sender.Canvas.Brush.Color := $cc;
end;
procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
begin
if lstTaskItemCurClickBackgroundIndex = Item.Index then
Sender.Canvas.Brush.Color := $cc;
end;
procedure TForm1.ListView1Click(Sender: TObject);
var
ARect: TRect;
Idx: Integer;
SubItemIndex: Integer;
pt: TPoint;
item : TLIstItem;
hittestinfo: TLVHitTestInfo;
Rect: TRect;
begin
Idx := -1;
pt:= ListView1.ScreenToClient( mouse.cursorpos );
item := ListView1.GetItemAt( pt.x, pt.y );
If assigned( item ) then
Idx := item.Index
else
begin
FillChar( hittestinfo, sizeof( hittestinfo ), 0 );
hittestinfo.pt := pt;
If -1 <>ListView1.perform( LVM_SUBITEMHITTEST, 0, lparam(@hittestinfo))
Then
Begin
Idx := hittestinfo.iItem;
SubItemIndex := hittestinfo.iSubItem;
End
Else
if (ListView1.Items.Count > 0) then
Idx := 0;
end;
if Idx >= 0 then
begin
Rect := ListView1.Items[Idx].DisplayRect(drBounds);
if lstTaskItemPrevClickBackgroudColorRect <> Rect then
begin
InvalidateRect(ListView1.Handle, lstTaskItemPrevClickBackgroudColorRect, True);
InvalidateRect(ListView1.Handle, Rect, True);
end;
lstTaskItemPrevClickBackgroudColorRect := Rect;
lstTaskItemCurClickBackgroundIndex := Idx;
end;
end;
TListView.UpdateItems()
. Это аннулирует предметы для вас. Или, что еще лучше, даже не аннулируйте элементы вручную. Щелчок по элементу автоматически запускает перерисовку. - person Remy Lebeau   schedule 28.10.2014