如何检测TListView组标题上的鼠标单击?
我正在使用Delphi10.1和VCL。如何在如何检测TListView组标题上的鼠标单击?,listview,delphi,vcl,delphi-10.1-berlin,Listview,Delphi,Vcl,Delphi 10.1 Berlin,我正在使用Delphi10.1和VCL。如何在TListView中检测到对组标题的单击或双击?不在列标题上。将ListView子类化以捕获与单击相关的消息(WM|LBUTTON(DOWN | UP),WM|lbuttondblck,等等),然后向ListView发送一条消息,指定单击的客户端坐标 根据文档,您必须将消息的wParam设置为-1以获取组信息,这意味着您必须通过直接调用SendMessage()发送LVM\u hitest消息,您不能使用将wParam设置为0的函数 单击组标题时,填
TListView
中检测到对组标题的单击或双击?不在列标题上。将ListView子类化以捕获与单击相关的消息(WM|LBUTTON(DOWN | UP)
,WM|lbuttondblck
,等等),然后向ListView发送一条消息,指定单击的客户端坐标
根据文档,您必须将消息的wParam
设置为-1以获取组信息,这意味着您必须通过直接调用SendMessage()
发送LVM\u hitest
消息,您不能使用将wParam
设置为0的函数
单击组标题时,填充的
LVHITTESTINFO
将启用LVHT\u EX\u Group\u标题
标志,并且iItem
字段将是组索引。答案基于Remy和Victoria注释,由Bummi at提供旧答案
对解决方案没有什么评论:
Uses
Winapi.CommCtrl; // For LVM_HITTEST
const
LVHT_EX_GROUP_HEADER = $10000000;
Uses Winapi.CommCtrl;
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
const
LVHT_EX_GROUP_HEADER = $10000000; // It is Valid for Windows Vista and above.
var
HTI: tLVHitTestInfo; // Defined on Winapi.CommCtrl
nGroupInx: integer;
begin
HTI.pt := point(X, Y); // Add cursor position
nGroupInx := SendMessage(ListView1.Handle, LVM_HITTEST, -1, LPARAM(@HTI)); // Return an Item
if nGroupInx <> -1 then // Is an Item found?
if (HTI.flags and LVHT_EX_GROUP_HEADER) = LVHT_EX_GROUP_HEADER then // Is it a Group Header?
ShowMessage('Clicked Group header:' + ' ' + nGroupInx.ToString);
end;
使用Winapi.CommCtrl;
程序TForm1.ListView1MouseDown(发送方:ToObject;按钮:TMouseButton;
移位:t移位状态;X,Y:整数);
常数
LVHT_EX_GROUP_标头=$10000000;//它对Windows Vista及以上版本有效。
变量
HTI:tLVHitTestInfo;//在Winapi.CommCtrl上定义
nGroupInx:整数;
开始
HTI.pt:=点(X,Y);//添加光标位置
nGroupInx:=SendMessage(ListView1.Handle,LVM_HITTEST,-1,LPARAM(@HTI));//退货
如果nGroupInx-1,则//是否找到项?
如果(HTI.flags和LVHT_EX_GROUP_HEADER)=LVHT_EX_GROUP_HEADER,那么//它是一个组头吗?
ShowMessage('Clicked Group header:'+''+nGroupInx.ToString);
结束;
尚未对此进行测试,但您确定列表视图在单击组标题时会收到类似于NM\u CLICK
的通知吗?@Victoria我尚未测试,因此不确定。这就是我提到其他信息的原因,too@Victoria我现在测试了它,实际上,当单击组标题时,不会发出NM\u CLICK
和NM\u DBCLK
,但会发出WM\u LBUTTON(向下|向上)