Как поместить картинку в заголовок 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.


Далее: Как узнать, по какой колонке был клик в TListView »»