如何在TListView标题列中显示复选框?

ded*_*oki 3 delphi listview tcheckbox

我需要在TListView的列标题中有一个复选框:

在此输入图像描述

我试过以下代码:

with CheckBox1 do
begin
  Parent := ListView1;
  Top := 0;
  Left := 4;
end;
Run Code Online (Sandbox Code Playgroud)

但复选框并不总是按预期工作.如何在TListView标题列中正确创建复选框?

TLa*_*ama 7

以下代码将复选框添加到列表视图的标题中,并显示如何处理它的click事件.

请注意,自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.
Run Code Online (Sandbox Code Playgroud)


在此输入图像描述

  • 但是,无论如何,我很遗憾地说你的程序没有在XP的标题中显示复选框.我相信Vista和comctl32 v6的含义是你必须拥有Vista和一个comctl v6清单.换句话说,如果您在vista上运行但没有显示comctl v6,那么您不会获得标题复选框.所以这只是我害怕的Vista. (4认同)