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

Материал из DRKB

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

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


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.


Source: Взято из http://forum.sources.ru
ID: 00623