Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как поместить картинку в заголовок TListView?

01.01.2007

Иногда бывает полезно в заголовке колонки показывать стрелочку, чтобы информировать пользователя, по какой колонке идёт сортировка. Добавьте следующий код в форму:

procedure TForm1.SetColumnImage( List: TListView; Column, Image: Integer; 
                                 
ShowImage: Boolean);
var
 
Align,hHeader: integer;
  HD
: HD_ITEM;
 
begin
  hHeader
:= SendMessage(List.Handle, LVM_GETHEADER, 0, 0);
 
with HD do
 
begin    
   
case List.Columns[Column].Alignment of
      taLeftJustify
:  Align := HDF_LEFT;
      taCenter
:       Align := HDF_CENTER;
      taRightJustify
: Align := HDF_RIGHT;
   
else
     
Align := HDF_LEFT;
   
end;
 
    mask
:= HDI_IMAGE or HDI_FORMAT;
 
    pszText
:= PChar(List.Columns[Column].Caption);
 
   
if ShowImage then
      fmt
:= HDF_STRING or HDF_IMAGE or HDF_BITMAP_ON_RIGHT
   
else
      fmt
:= HDF_STRING or Align;
 
    iImage
:= Image;
 
end;
 
SendMessage(hHeader, HDM_SETITEM, Column, Integer(@HD));
end;

Картинки берутся из списка SmallImages. Вам надо будет вызвать эту функцию для каждой колонки и установить ShowImage в TRUE для той колонки, которую Вы будете сортировать. Сделать это можно в функции OnColumnClick():

procedure TForm1.ListView1ColumnClick(Sender: TObject; 
 
Column: TListColumn);
var
  i
: integer;
begin
 
// Это Ваша собственная функция сортировки
 
CustomSort( @CustomSortProc, Column.Index );
 
// Этот цикл отображает иконку в выбранной колонке.
 
for i := 0 to ListView1.Columns.Count-1 do
   
SetColumnImage( ListView1, i, 0, i = Column.Index );
end;

Проблема: Изменение размера колонки генерирует сообщение WM_PAINT, которое стирает картинку, поэтому Вам прийдётся переопределить WM_PAINT и вызвать SetColumnImage снова.

Использовался компонент TApplicationEvents в delphi 5.

Взято из https://forum.sources.ru