delphilistviewtcheckbox

How to show a check box in TListView header column?


I need to have a check box in a column header of a TListView:

enter image description here

I have tried the following code:

with CheckBox1 do
begin
  Parent := ListView1;
  Top := 0;
  Left := 4;
end;

but the check box doesn't always work as expected. How can I properly create a check box in TListView header column ?


Solution

  • The following code will add the check box to the list view's header and shows how to handle the click event for it.

    Please note, that the following code is supported since Windows Vista.

    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, CommCtrl;
    
    type
      TForm1 = class(TForm)
        ListView1: TListView;
        procedure FormCreate(Sender: TObject);
      private
        HeaderID: Integer;
        procedure WMNotify(var AMessage: TWMNotify); message WM_NOTIFY;
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.WMNotify(var AMessage: TWMNotify);
    begin
      if AMessage.NMHdr^.idFrom = HeaderID then
        if AMessage.NMHdr^.code = HDN_ITEMSTATEICONCLICK then
          ShowMessage('You have clicked the header check box');
    
      inherited;
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    var
      HeaderHandle: HWND;
      HeaderItem: HD_ITEM;
      HeaderStyle: Integer;
    begin
      ListView_SetExtendedListViewStyle(ListView1.Handle, LVS_EX_CHECKBOXES or LVS_EX_FULLROWSELECT);
      HeaderHandle := ListView_GetHeader(ListView1.Handle);
      HeaderStyle := GetWindowLong(HeaderHandle, GWL_STYLE);
      HeaderStyle := HeaderStyle or HDS_CHECKBOXES;
      SetWindowLong(HeaderHandle, GWL_STYLE, HeaderStyle);
    
      HeaderItem.Mask := HDI_FORMAT;
      Header_GetItem(HeaderHandle, 0, HeaderItem);
      HeaderItem.fmt := HeaderItem.fmt or HDF_CHECKBOX or HDF_FIXEDWIDTH;
      Header_SetItem(HeaderHandle, 0, HeaderItem);
    
      HeaderID := GetDlgCtrlID(HeaderHandle);
    end;
    
    end.
    


    enter image description here