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标题列中正确创建复选框?
以下代码将复选框添加到列表视图的标题中,并显示如何处理它的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)